Importation d'un .dat avec entête séparé

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

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Importation d'un .dat avec entête séparé

Messagepar Pierre-Marc Chouinard » 12 Sep 2017, 18:10

SAlut

J'essait d'importer en R pourla première fois un fichier ".dat". L'entête du fichier, c-à-d la position de chaque variable et fournis séparément dans un fichier à part. Je n'arrive pas à importer mes variables de façon à ce qu'elle soit séparer et je n'arrive pas à lier le fichier contenant le nom et la position des variables.

Ex. Mon fichier .dat: TE_2017.dat

39 14 2030817 8922007 5 5 8 0 0
39 14 2030817 8922008 5 5 8 0 0
39 14 2030817 8922015 5 5 8 0 0
39 14 2030817 8922016 5 5 8 0 0
39 14 2030817 8922018 1 5 8 0 0
39 14 2030817 8922019 1 5 8 0 0
39 14 3030817 4382001 5 5 8 0 0
39 14 3030817 4382002 5 5 8 0 0
39 14 3030817 4382003 5 5 8 0 0
39 14 3030817 4382004 1 5 8 0 0
39 14 3030817 8932001 1 5 8 0 0
39 14 3030817 8932001 1 6 17 0 0
39 14 3030817 8932001 1 20 7 0 0
39 14 3030817 8932002 1 5 8 0 0
39 14 3030817 8932002 1 6 17 0 0
39 14 3030817 8932002 1 20 7 0 0
39 14 3030817 8932003 8 1



et le fichier comtenant les entêtes: format entête.txt

nbpc 1-2 /* Numéro de NBPC du navire */
no_rel 3-5 /* Numéro du relevé */
No_stn 6-8 /* Numéro de la station */
esp 15-18 /* Code de l'espèce selon norme Strapp */
Specimen 19-22 /* Numéro de poisson (#table + #poisson) */
sexe 24 /* Sexe du spécimen (1=male, 5=femelle, 9=inc) */
tsech 26-27 /* Identification du type de prélèvement */
tdemsp 29-30 /* Identification du type de demande associée au prélèvement */
Tri 31-32 /* Application d'un tri 0=non, 1(2)=sur taille ou age selon l'espèce */
Categ 33-34; /* Catégorie de Poisson-1=petit, 2=gros */


Comment puis-je charger ce fichier pour que chaque variable est sa propre colonne et associer le bon nom de variable à chaque variable pour chaque colonne ??

Michaël Delorme
Messages : 67
Enregistré le : 04 Avr 2016, 10:21

Re: Importation d'un .dat avec entête séparé

Messagepar Michaël Delorme » 13 Sep 2017, 06:45

Il semble que dans ce cas tu as plus d'en-têtes décrites (10) que de colonnes présentes dans le fichier de données (9) et que le fichier d'en-têtes indique des positions de colonnes (1-2, 3-5, etc.) alors que tu montres un fichier de données délimitées par des espaces...
Néanmoins tu peux t'inspirer de :

Code : Tout sélectionner

donnees <- read.delim("TE_2017.dat", sep = "", header = FALSE)
entete <- read.delim("entête.txt", sep = "", header = FALSE, fileEncoding = "UTF-8", comment.char = "/")
colnames(donnees) <- make.names(tolower(entete[1:9, "V1"]), unique = TRUE)

  • entete[1:9, "V1"] : prend seulement les 9 premières ligne de la 1ère colonne (donc les noms de colonnes utilisables par le fichier de données)
  • tolower : parce que je n'aime pas les noms de variable mélangeant majuscules et minuscules
  • make.names : pour que le nom de variable soit valide pour R et unique

On obtient :

Code : Tout sélectionner

> donnees
   nbpc no_rel  no_stn     esp specimen sexe tsech tdemsp tri
1    39     14 2030817 8922007        5    5     8      0   0
2    39     14 2030817 8922008        5    5     8      0   0
3    39     14 2030817 8922015        5    5     8      0   0
4    39     14 2030817 8922016        5    5     8      0   0
5    39     14 2030817 8922018        1    5     8      0   0
6    39     14 2030817 8922019        1    5     8      0   0
7    39     14 3030817 4382001        5    5     8      0   0
8    39     14 3030817 4382002        5    5     8      0   0
9    39     14 3030817 4382003        5    5     8      0   0
10   39     14 3030817 4382004        1    5     8      0   0
11   39     14 3030817 8932001        1    5     8      0   0
12   39     14 3030817 8932001        1    6    17      0   0
13   39     14 3030817 8932001        1   20     7      0   0
14   39     14 3030817 8932002        1    5     8      0   0
15   39     14 3030817 8932002        1    6    17      0   0
16   39     14 3030817 8932002        1   20     7      0   0
17   39     14 3030817 8932003        8    1    NA     NA  NA

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Re: Importation d'un .dat avec entête séparé

Messagepar Pierre-Marc Chouinard » 13 Sep 2017, 12:40

Premièrement il manqué en effet une ligne à mon entête, le fichier d'entête devrait être comme suit:

nbpc 1-2 /* Numéro de NBPC du navire
no_rel 3-5 /* Numéro du relevé */
No_stn 6-8 /* Numéro de la station */
DatDeTow 9-14 /* Date (jjmmaa) de réalisation du trait */
esp 15-18 /* Code de l'espèce selon norme Strapp */
Specimen 19-23 /* Numéro de poisson (#table + #poisson) */
sexe 24 -25 /* Sexe du spécimen (1=male, 5=femelle, 9=inc) */
tsech 26-27 /* Identification du type de prélèvement */
tdemsp 29-30 /* Identification du type de demande associée au prélèvement */
Tri 31-32 /* Application d'un tri 0=non, 1(2)=sur taille ou age selon l'espèce */
Categ 33-34; /* Catégorie de Poisson-1=petit, 2=gros */



Ensuite, je me rend compte que je n'ai pas été suffisament claire dans mon explication de la structure du fichier de données à lire. En fait ce ne sont pas des espaces qui délimite mes colonnes, les espaces sont seulement des blancs (espace non utiliés). Par exemple, pour le numéro de relevé, c'est un champ avec un potentiel de 3 positions (position 3 à 5), mais actuellement dans le fichier nous ne somme qu'au relevé / 20/, donc la premier position est laissé en blanc quand nous arriveront au relevé 100 les 3 espace seront occupés /100/ ).

Pour essayer d''être claire, ma ligne (39 14 2030817 8922007 5 5 8 0 0) devrait ce lire comme suit:

39/ 14/ 20/30817 /892/2007/ 5/ 5/ 8/ 0/ 0/

39 = nbpc; position 1-2
14= no_rel; position 3-5 (à interpreter comme 014)
20 = numéro de trait; position 6-8 (à interpreter comme 020)
30817 = date; position 9-14
892= code d'espèce; position 15-18
2007= numéro de specimen; position 19-23
5= sexe; position 24-25 (à interpreter comme 05)
....


Je sais que le fichier aurait pu etre bâtie différament, mais je ne peu pas le changer et c'est CE format que je doit lire.

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Importation d'un .dat avec entête séparé

Messagepar Logez Maxime » 13 Sep 2017, 12:58

Bonjour,

Pour lire des fichiers formatés comme le tien tu peux utiliser la fonction read.fwf en spécifiant la largeur des colonnes.

Code : Tout sélectionner

entete <- read.table("entête.txt", sep = " ", h = F, comment.char = "/", stringsAsFactors = FALSE)
entete$V2 <- sub("\\D$", "", entete$V2)
bob <- do.call(rbind, lapply(strsplit(entete$V2, "-"), as.integer))
wds <- pmax(bob[,2]-bob[,1], c(bob[1,2], diff(bob[,2])))

tab <- read.fwf("TE_2017.dat", wds)

Cordialement,
Maxime

Michaël Delorme
Messages : 67
Enregistré le : 04 Avr 2016, 10:21

Re: Importation d'un .dat avec entête séparé

Messagepar Michaël Delorme » 13 Sep 2017, 13:41

(en supprimant manuellement un espace superflu dans l'en-tête dans "sexe 24 -25")

Code : Tout sélectionner

library(tidyverse)
entete <- read.delim("entête.txt", sep = "", header = FALSE, fileEncoding = "UTF-8", comment.char = "/") %>%
  separate(V2, c("debut", "fin"), sep = "-") %>%
  mutate(debut = as.numeric(debut),
         fin = as.numeric(gsub(";", "", fin)),
         longueur = fin - debut + 1)

donnees <- read.fwf("TE_2017.dat", widths = entete$longueur, header = FALSE)
colnames(donnees) <- make.names(tolower(entete$V1), unique = TRUE)
donnees


Il y a toujours un souci car ton fichier de données a des lignes de 31 ou 32 caractères alors qu'elles devraient en faire 34...

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Re: Importation d'un .dat avec entête séparé

Messagepar Pierre-Marc Chouinard » 13 Sep 2017, 15:08

Merci pour vos réponses.

Finalement j'ai utilise l'option read.fwf et j'ai modifier mon fichier d'entête (seul sur lequel j'ai un pouvoir de modification) pour qu'il donne le nom de la variable et le nombre de champs que chaque variable utilise, plutot que leur position, dans le fichier de donnée.

Entete.csv
variable position
nbpcc 2
no_rel 3
No_stn 3
DatDeTow 6
esp 4
Specimen 4
sexe 2
tsech 3
tdemsp 3
Tri 2
Categ 2


Code : Tout sélectionner

Entete<- read.csv2("Entete.csv",dec=".", na.string="")

tab2 <- read.fwf("TE_2017.dat", Entete$position)
colnames(tab2)<-Entete$variable


Merci à tous pour votre aide ça m'a bien fait progresser

PMC


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité