importation de données. fichier "irrégulier"

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

herve chapuis
Messages : 110
Enregistré le : 05 Déc 2008, 15:26

importation de données. fichier "irrégulier"

Messagepar herve chapuis » 24 Avr 2023, 08:58

Bonjour à tous

Je désire importer un fichier en colonnes mais, hélas, avec un nombre de colonnes non constant.
Sur 100000 ligne, la plupart du temps j'ai 8 colonnes.

Code : Tout sélectionner

AGP  11150080 2 10APR2011       10330325      10310301    AGPD          .
AGP  11150127 2 10APR2011       10150356      10370301    AGPD          .
AGP  11150164 1 10APR2011       10040082      10310204    AGPD          .
AGP  11150175 1 10APR2011       10150020      10310285    AGPD          .

Mais parfois le fichier a le mauvais gout de varier en ajoutant une information en 7ème position.

Code : Tout sélectionner

AGP  11390157 2 25SEP2011       10270334      11030312    AGPD          .
AGP  11390221 2 25SEP2011       10370012      11030325    AGPD          .
AGP7 11410013 1 11OCT2011       10460383      10400748    AGP77         .
AGP7 11410018 2 11OCT2011       10460383      10400748 R4 AGP77 14MAY2012
AGP7 11410020 2 11OCT2011       10460383      10400748 M2 AGP77 28MAY2012
AGP7 11410093 2 11OCT2011       10460354      10460494 R9 AGP77 07AUG2013


Sans surprise si je tente une lecture de base j'obtiens un message d'erreur.
> pedi<-read.table("XXX_identif.new")
Erreur dans scan(file = file, what = what, sep = sep, quote = quote, dec = dec, :
la ligne 198 n'avait pas 8 éléments
.

Est-il possible avec R d'obtenir gain de cause ?
J'ai tenté de prédigérer le fichier avec cut (les fichiers sont sur une station Linux) pour ne conserver que les 6 premières colonnes (ce sont elles qui m'intéressent), mais vu que les colonnes sont espacées par des espaces et non des tabulations, le résultat est décevant.
Je ne vois pas comment demander à R de se rendre compte qu'il doit lire 9 colonnes quand il n'y en n'a que 8.
Est-il possible de lui imposer un format de lecture comme en Fortran en lui disant que le premier champ est à lire sur les colonnes 1 à 4, le second sur les colonnes 6 à 13 et ainsi de suite ? Ce serait LA solution mais je ne sais pas la mettre en œuvre.

J'ai aussi tenté d'ouvrir le fichier avec un tableur (gnumeric sous Linux, mais Excel ne fait pas mieux sous Windows) avec des colonnes de largeur fixe (ce que je voudrais faire avec R). Et là j'ai un étrange souci : les dates. La colonne 4 est une date et les tableurs utilisés ont le mauvais gout de convertir en date les chaines de caractère avec les mois SEP et OCT et de laisser intactes toutes les autres. Ce qui rend pénible l'exploitation du fichier.

Merci de votre aide.
Ingénieur de recherche INRAE Toulouse

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: importation de données. fichier "irrégulier"

Messagepar Pierre-Yves Berrard » 24 Avr 2023, 09:33

Bonjour Hervé,
La fonction `read.fwf` répond à ton besoin.
PY

herve chapuis
Messages : 110
Enregistré le : 05 Déc 2008, 15:26

Re: importation de données. fichier "irrégulier"

Messagepar herve chapuis » 24 Avr 2023, 09:53

Finalement je pense avoir résolu mon problème en procédant en plusieurs étapes.
1. utilisation de readLines

Code : Tout sélectionner

pedi<-data.frame(readLines("AGPOP_identif.new"))
colnames(pedi)<-"chaine"


2. attribution des colonnes en découpant la chaine de caractère comme je le souhaite

Code : Tout sélectionner

pedi$ID_ANIM<-substr(pedi$chaine,6,13)
pedi$sexe<-substr(pedi$chaine,15,15)
pedi$D_NAIS<-dmy(substr(pedi$chaine,17,25))
pedi$sexe<-substr(pedi$chaine,15,15)
...


Ce n'est pas "simple" mais je m'en sors. Au pris d'une ligne de code par colonne à créer dans la table finale.
Y a t il une façon plus compacte de procéder ?

Merci
Ingénieur de recherche INRAE Toulouse

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: importation de données. fichier "irrégulier"

Messagepar Pierre-Yves Berrard » 24 Avr 2023, 11:32

herve chapuis a écrit :Est-il possible de lui imposer un format de lecture comme en Fortran en lui disant que le premier champ est à lire sur les colonnes 1 à 4, le second sur les colonnes 6 à 13 et ainsi de suite ? Ce serait LA solution mais je ne sais pas la mettre en œuvre.

Pierre-Yves Berrard a écrit :Bonjour Hervé,
La fonction `read.fwf` répond à ton besoin.
PY

herve chapuis
Messages : 110
Enregistré le : 05 Déc 2008, 15:26

Re: importation de données. fichier "irrégulier"

Messagepar herve chapuis » 24 Avr 2023, 11:52

Nos messages se sont croisés.
Je regarde l'aide de read.fwf.
Merci
Ingénieur de recherche INRAE Toulouse

herve chapuis
Messages : 110
Enregistré le : 05 Déc 2008, 15:26

Re: importation de données. fichier "irrégulier"

Messagepar herve chapuis » 24 Avr 2023, 15:00

Pour finir, j'ai eu du mal à comprendre read.fwf, mais m'en suis tiré avec read_fwf.

En tous cas merci de la suggestion ! :)
Ingénieur de recherche INRAE Toulouse

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: importation de données. fichier "irrégulier"

Messagepar Pierre-Yves Berrard » 24 Avr 2023, 15:11

herve chapuis a écrit :Pour finir, j'ai eu du mal à comprendre read.fwf, mais m'en suis tiré avec read_fwf.

Alors je te déconseille la lecture de ?read.fortran. ;-D
PY


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron