Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide svp : importation fichier txt sous R

Sujet résolu
    18 mai 2022 à 16:30:41

    Benzouye a écrit:

    Le problème vient du retour chariot ... Avec le copier/coller sur le forum (\r\n) qui est différent de celui de ton fichier (\n) ...

    fichier <- 'statlab.txt'
    contenu <- readChar(fichier, file.info(fichier)$size)
    donnees <- gsub( '([0-9\\. ]{50}) \n', '\\1', contenu )
    write( donnees, 'temp.txt' )
    colonnes <- c('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19')
    read.fwf( 'temp.txt', width=c(10,8,8,8,8,8,11,8,8,8,8,8,11,8,8,8,8,8,11), header=F, col.names=colonnes )

    Avec ça tu es bon !

    MAGIQUE ! Franchement je vous remercie infiniment, ça a marché, ça rajoute juste une ligne 116 avec des NA mais ce n'est pas grave je pourrais l'effacer, il me reste juste à bien comprendre votre code et les fonctions que vous avez utilisé, merci beaucoup 

    • Partager sur Facebook
    • Partager sur Twitter
      18 mai 2022 à 17:25:18

      La première ligne crée une variable fichier avec le nom du fichier à travailler.

      La deuxième ligne stocke le contenu du fichier dans la variable contenu sous forme de chaîne de caractère.

      La troisième ligne supprime le retour à la ligne (caractère \n) après toutes les occurrences de 50 caractères contenant des chiffres de 0 à 9 ou des points ou des espaces via la regexp [0-9\\. ]{50}, et place le résultat dans la variable donnees.

      La quatrième ligne crée un fichier nommé temp.txt avec la variable donnees comme contenu.

      La cinquième ligne définie le nom des entêtes de colonnes (remplacer 1 à 19 par les vrais noms)

      La sixième ligne transforme le contenu du fichier temp.txt en un datatable exploitable

      Pour la dernière ligne pleine de NA, cela est dû au retour chariot à la fin de ton fichier ... Le supprimer évitera cette ligne inutile ...

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        18 mai 2022 à 19:43:02

        je l'avais pourtant évoqué le coup du \r\n et du \n (sans remettre le code) :-°
        • Partager sur Facebook
        • Partager sur Twitter
          18 mai 2022 à 23:14:24

          Que demander de plus ? Franchement je vous remercie infiniment vous êtes des monstres, j’en suis très reconnaissant, si ce n’est pas indiscret, comment vous avez fait pour avoir ce niveau vous suiviez des formations ?
          • Partager sur Facebook
          • Partager sur Twitter
            19 mai 2022 à 0:43:28

            @umfred : je n'avais pas vu ton message sur les LF ... my bad ...

            @WatneyMarc : sans vouloir crâner, je ne connaissais pas le R avant ta question... juste une bonne culture générale en programmation et de bonnes questions aux moteurs de recherche, et la doc, toujours la doc ... allez courage, le chemin est long mais d'autres le parcourent aussi, on est jamais seul !

            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
              19 mai 2022 à 8:59:55

              Merci beaucoup à vous. Comme j'avais posté mon problème dans un autre forum j'ai eu une réponse d'un monsieur qui ne code pas sur R, je vous mets ce qui m'a proposé pour voir un peu, pensez vous que ça aurait marché sur R ? 

              Principe 1 : 

              Créer une matrice 115l * 19c
              
              x, y, i = 0
              
              Faire une boucle
                   incrémenter i de 1
                   lire une ligne du fichier dans unevariable //on variable de programmation pas ce que toi tu appelles variable et qui donc prête à confusion
                   spliter la ligne avec les espaces comme séparateur dans unecollection // tableau, liste chainée, vecteur, etc...
                   Faire une boucle de 0 à la taille de lacollection -1 avec la variable j comme itérateur
                        placerl'item j de la collection à l'emplacementx, y de la matrice
                        incrémenter x de 1
              
                   Si i vaut 4
                        x, i = 0
                        incrémenter y de 1       
              
              Principe 2 :
              Créer une matrice 115l * 19c
              x, y = 0
              Lire tout le fichier dans une variable
              
              //Option 2.1 Si R peut splitter sur plusieurs caractères
              Spliter la variable avec les espaces et les sauts de lignes comme séparateurs dans une collection
              
              //Option 2.2 Si R ne peut splitter que sur un caractère
              Remplacer tous les sauts de ligne par un espace
              Spliter la ligne avec les espaces comme séparateur dans une collection
              
              Faire une boucle de 0 à la taille de lacollection -1 avec la variable i comme itérateur
                    placerl'item i de la collection à l'emplacementx, y de la matrice
                    incrémenter x de 1
                    sii + 1 est un multiple de 19
                          x = 0
                          incrémenter y de 1
              
              
              • Partager sur Facebook
              • Partager sur Twitter
                19 mai 2022 à 10:44:22

                c'est un peu ce que le code fait: 

                le readChar lit le fichier et met son contenu dans contenu

                le gsub remet en forme les lignes: elle remplace une chaine de 50 caractères suivis par une fin de ligne ( '([0-9\\. ]{50}) \n') par la chaine de 50 caractères (\\1' = 1er groupe/partie de la correspondance ? (par déduction)) , sinon elle ne change rien (ça revient à supprimer les fin de lignes sur les 3 lignes de 50 caractères pour avoir une ligne avec les 19 champs)

                ensuite ça diffère du code dans lequel on remet le tout dans un fichier pour exploiter la fonction read.fwf

                la 2nde méthode que tu donnes, repose sur l'utilisation d'une fonction de type split (strsplit en R dans notre cas apparemment) qui permet de diviser une chaine en tableau de chaine selon un séparateur; ensuite il faut "convertir" ce tableau de chaine en n lignes de 19 chaines pour arriver à nos fins.

                (comme nous sommes tout 3 des débutants en R, on n'a pas forcément toutes les bonnes méthodes)

                • Partager sur Facebook
                • Partager sur Twitter
                  19 mai 2022 à 11:07:01

                  umfred a écrit:

                  c'est un peu ce que le code fait: 

                  le readChar lit le fichier et met son contenu dans contenu

                  le gsub remet en forme les lignes: elle remplace une chaine de 50 caractères suivis par une fin de ligne ( '([0-9\\. ]{50}) \n') par la chaine de 50 caractères (\\1' = 1er groupe/partie de la correspondance ? (par déduction)) , sinon elle ne change rien (ça revient à supprimer les fin de lignes sur les 3 lignes de 50 caractères pour avoir une ligne avec les 19 champs)

                  ensuite ça diffère du code dans lequel on remet le tout dans un fichier pour exploiter la fonction read.fwf

                  la 2nde méthode que tu donnes, repose sur l'utilisation d'une fonction de type split (strsplit en R dans notre cas apparemment) qui permet de diviser une chaine en tableau de chaine selon un séparateur; ensuite il faut "convertir" ce tableau de chaine en n lignes de 19 chaines pour arriver à nos fins.

                  (comme nous sommes tout 3 des débutants en R, on n'a pas forcément toutes les bonnes méthodes)


                  Je vous remercie infiniment pour cette explication, merci beaucoup de m'avoir éclairé sur ces différentes méthodes
                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 mai 2022 à 11:57:31

                    Dans sa méthode on ne tient pas compte de la largeur variable des colonnes, 8, 10 ou 11 ...

                    Je pense que read.fwf est la meilleure solution (plus fexible et reproductible) pour exploiter le texte reformaté, et que la regexp est la meilleure solution (plus polyvalente et moins verbeuse) pour reformater le texte.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                      19 mai 2022 à 13:15:44

                      Benzouye a écrit:

                      Dans sa méthode on ne tient pas compte de la largeur variable des colonnes, 8, 10 ou 11 ...

                      Je pense que read.fwf est la meilleure solution (plus fexible et reproductible) pour exploiter le texte reformaté, et que la regexp est la meilleure solution (plus polyvalente et moins verbeuse) pour reformater le texte.


                      exactement, d'après ce que j'ai pu lire sur internet vous avez totalement raison, read.fwf, regexp est la meilleure solution. merci beaucoup

                      -
                      Edité par WatneyMarc 19 mai 2022 à 13:17:15

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Aide svp : importation fichier txt sous R

                      × 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