Partage
  • Partager sur Facebook
  • Partager sur Twitter

[postgresql] Split string sans délimiteur

Sujet résolu
    9 janvier 2018 à 15:23:47

    Bonjour à tous,

    Après quelques heures de recherche, je me retourne vers vous pour savoir s'il était possible de spliter un "string" en plusieurs lignes sans délimiteur.

    Par exemple j'ai ID : "12345" sur une ligne, je voudrais avoir 

    ID : "1"
    ID : "2"
    ID : "3"
    ID : "4"
    ID : "5"

    J'ai vu passer différentes fonctions mais elles demandent toutes un délimiteur.. Dois-je développer une fonction ??

    Merci à vous

    • Partager sur Facebook
    • Partager sur Twitter
    Starcraft Broodwar is BACK !  MP pour jouer ensemble ! :D
      9 janvier 2018 à 17:17:18

      Bonjour,

      Hiitch a écrit:

      Dois-je développer une fonction ?

      Je ne suis pas expert PostGreSQL, mais à mon avis tu n'auras pas le choix ...

      Une procédure stockée avec un curseur pour balayer chaque enregistrement de la table en question, récupérer l'id de l'enregistrement, utiliser char_length() et dans une boucle un substring().

      Attention toutefois si la table est grande, le curseur va être long ...

      -
      Edité par Benzouye 9 janvier 2018 à 17:17:54

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        10 janvier 2018 à 10:58:57

        Benzouye a écrit:

        Bonjour,

        Hiitch a écrit:

        Dois-je développer une fonction ?

        Je ne suis pas expert PostGreSQL, mais à mon avis tu n'auras pas le choix ...

        Une procédure stockée avec un curseur pour balayer chaque enregistrement de la table en question, récupérer l'id de l'enregistrement, utiliser char_length() et dans une boucle un substring().

        Attention toutefois si la table est grande, le curseur va être long ...

        -
        Edité par Benzouye il y a environ 17 heures


        Bonjour Benzouye,

        Merci de ta réponse ! 

        Oui ma table est très grande 600k d'enregistrements :'( ...

        • Partager sur Facebook
        • Partager sur Twitter
        Starcraft Broodwar is BACK !  MP pour jouer ensemble ! :D
          10 janvier 2018 à 11:03:23

          Hiitch a écrit:

          ma table est très grande 600k d'enregistrements :'( ...

          Tu ne devrais lancer la procédure qu'une seule fois non ?

          Tu fais ta reprise de données pour normaliser la relation en insérant dans une nouvelle table chaque ID individuellement ...

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            11 janvier 2018 à 14:28:18

            select 'ID : "12345"' as foo 
            into mytable1
            ;
            select split_part (foo,  ':', 1) || ' : ' as idt,
            btrim ( 
            (split_part (foo,  ':', 2)), ' "' ) as thestring 
            into mytable2
            from mytable1
            ;
            select idt 
            || '"' ||
            unnest(regexp_split_to_array( thestring , E'\\s*')) 
            || '"' 
            from mytable2  
            ;

            -
            Edité par WayneDunlop 11 janvier 2018 à 14:31:29

            • Partager sur Facebook
            • Partager sur Twitter
              11 janvier 2018 à 14:49:22

              Oh yeah WayneDunlop !!!

              https://www.postgresql.org/docs/9.1/static/functions-matching.html

              L'exemple pour regexp_split_to_array est parfait, mais je pense que regexp_split_to_table est préférable pour traiter le tout et normaliser ...

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                11 janvier 2018 à 16:28:31

                Après avoir envoyé ma réponse , je me suis dit...
                Tout dépend de ce que l'OP voulait dire par "ligne" ...
                Est-ce la "ligne" d'une table ( = "row" ), 
                - ou bien -
                une nouvelle ligne à l'intérieure d'un même champs ( = la suite d'un "\n")
                ???
                --------------------------
                D'ou cette deuxième version avec la nouvelle ligne dans le champ.
                ---------------------------
                drop table if exists mytable1 ;
                drop table if exists mytable2 ; 
                drop table if exists mytable3 ;
                select'ID : "12345"' as foo 
                into mytable1
                ;
                select foo,
                btrim ( 
                (split_part (foo,  ':', 2)), ' " ' ) as thestring 
                into mytable2
                from mytable1
                ;
                select foo,
                thestring,
                'ID : "' ||
                ( unnest(
                regexp_split_to_array(thestring, '')
                )|| '"'
                )as splat
                into mytable3 
                from mytable2  
                ;
                select foo,
                array_agg (splat ) as splat_array,
                array_to_string(array_agg (splat ), E'\n') as splat_string 
                from mytable3
                group by foo
                ;

                -
                Edité par WayneDunlop 11 janvier 2018 à 16:31:29

                • Partager sur Facebook
                • Partager sur Twitter
                  11 janvier 2018 à 16:57:10

                  En fait je pense qu'il a une table avec dans une colonne la liste d'id stockés concaténés sans séparateurs :

                  12345

                  253

                  869514

                  123

                  etc.

                  Je lui conseille du coup de normaliser sa base en créant une table de relation ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    16 janvier 2018 à 16:20:03

                    Bonjour à vous,

                    Je vous remercie de l'aide que vous apportez ! Je suis vraiment désolé si je ne répond pas , c'est que je suis sur trois projets en même temps (en entreprise) dont cette base de données ... et en cours j'ai un projet androïd.

                    J'étudie vos réponses, je fais également des recherches pour comprendre le fonctionnement. Même si je n'aime pas le SQL (pour l'instant peut être que ça va changer) je pense que c'est important de connaître ce langage 

                    ---------------------------------------------------------------------------------------

                    WayneDunlop a écrit:

                    select 'ID : "12345"' as foo 
                    into mytable1
                    ;
                    select split_part (foo,  ':', 1) || ' : ' as idt,
                    btrim ( 
                    (split_part (foo,  ':', 2)), ' "' ) as thestring 
                    into mytable2
                    from mytable1
                    ;
                    select idt 
                    || '"' ||
                    unnest(regexp_split_to_array( thestring , E'\\s*')) 
                    || '"' 
                    from mytable2  
                    ;

                    -
                    Edité par WayneDunlop 11 janvier 2018 à 14:31:29


                    Merci beaucoup c'est plutôt dans ce sens que je voulais dire ligne = row.
                    Je suis entrain de décortiquer ton code et je comprend petit à petit.

                    ------------------------------------------------------------------------------------------

                    Bonjour,

                    J'ai une question par rapport à l'expression régulière qui se trouve dans la fonction regex_split_to_array.
                    Cette expression permet d'indiquer à la fonction d'effectuer une nouvelle ROW à chaque caractère ?

                    ------------------------------------------------------------------------------------------

                    C'est bon je viens de comprendre. Je vous remercie en tout cas ! :D

                    -
                    Edité par Hiitch 17 janvier 2018 à 10:44:59

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Starcraft Broodwar is BACK !  MP pour jouer ensemble ! :D

                    [postgresql] Split string sans délimiteur

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown