2 votes

Comment lire un fichier dans le format suivant

J'ai de nombreux fichiers que je veux lire. Le format des fichiers est exactement comme indiqué ci-dessous.

J'ai essayé de nombreux formats de packages pour les lire et aucun d'entre eux ne semble fonctionner. Les lignes commençant par "-" doivent être sautées. Il y a environ 102 colonnes dans les fichiers mais je n'en montre que quelques-unes. Les lignes commençant par "-" se trouvent en réalité dans les 1ère, 3ème et dernières lignes.

Les fichiers sont dans le format suivant

------------------------------------------------
|Delivery |Created by |Time    |Created on|SDst|
------------------------------------------------
|84181375 |BATCHJOBMGR|19:33:47|01/05/2017|    |
|84181376 |BATCHJOBMGR|19:33:47|01/05/2017|    |
------------------------------------------------

J'ai essayé ce qui suit :

en utilisant read.table

temp <- read.delim(file="LIKP_01012016_01312016.txt", header=TRUE, 
                   stringsAsFactors=FALSE, 
                   strip.white=TRUE, sep="|", skip = 1, comment.char = "-")

en utilisant data.table

temp <- fread(input="LIKP_01012017_01312017.txt",  
              stringsAsFactors=FALSE, strip.white=TRUE, 
              sep="|",quote = "-", skip=1)

De toute évidence, je ne fais pas quelque chose correctement. Pourriez-vous m'aider à lire ces fichiers?

Merci d'avance.

Satish

5voto

G. Grothendieck Points 40825

1) Dans les données d'exemple, les seuls signes négatifs se trouvent dans des lignes en pointillés. Si cela est également vrai pour vos vraies données, alors ce qui suit devrait fonctionner. Remplacez text = Lines par "LIKP_01012016_01312016.txt". Notez que comment.char = "-" fait en sorte que toute ligne avec un signe négatif a ce signe et tout ce qui suit sur sa ligne ignoré, transformant effectivement les lignes de signes négatifs en lignes vides.

read.table(text = Lines, header = TRUE, sep = "|", as.is = TRUE, 
        comment.char = "-", check.names = FALSE, strip.white = TRUE)[2:6]

résultat :

  Delivery  Created by     Time Created on SDst
1 84181375 BATCHJOBMGR 19:33:47 01/05/2017   NA
2 84181376 BATCHJOBMGR 19:33:47 01/05/2017   NA

2) Si vous avez des signes négatifs dans les données, alors sautez simplement la première ligne, utilisez fill = TRUE et supprimez la première et la dernière ligne (qui sont les seules restantes avec tous les signes négatifs).

DF <- read.table(text = Lines, header = TRUE, sep = "|", as.is = TRUE, 
        skip = 1, fill = TRUE, check.names = FALSE, strip.white = TRUE)[2:6]
n <- nrow(DF)
DF <- DF[-c(1, n), ]

Note : L'entrée pour le code ci-dessus est :

Lines <- "------------------------------------------------
|Delivery |Created by |Time    |Created on|SDst|
------------------------------------------------
|84181375 |BATCHJOBMGR|19:33:47|01/05/2017|    |
|84181376 |BATCHJOBMGR|19:33:47|01/05/2017|    |
------------------------------------------------"

0voto

rnso Points 11304

Vous pouvez utiliser la commande system() pour corriger chacun des fichiers d'entrée. Ce qui suit est pour Linux en utilisant l'utilitaire sed. Toutes les lignes commençant par - sont supprimées (sed '/^-/d'). De plus, tous les caractères de tuyau (|) en tête et en queue sont également supprimés (sed 's/^|//' et sed 's/|$//'). La sortie peut être enregistrée dans un fichier temporaire qui peut être lu avec la commande habituelle read.csv, en spécifiant le séparateur comme | :

> system("cat LIKP_01012016_01312016.txt | sed '/^-/d' | sed 's/^|//' | sed 's/|$//' > temp.csv")
> dd = read.csv('temp.csv', na.strings='', sep="|")
> dd
  Delivery  Created.by     Time Created.on SDst
1 84181375 BATCHJOBMGR 19:33:47 01/05/2017   NA
2 84181376 BATCHJOBMGR 19:33:47 01/05/2017   NA

Ce qui précède peut être placé dans une boucle for pour convertir et lire tous les fichiers un par un.

0voto

Jacob H Points 2317

Approche différente:

con <- file('chemin/vers/fichier.txt')

d <- readLines(con)

d <- read.delim(textConnection(d[!grepl("-", d)]), sep = '|')[2:6]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X