2014-01-14 9 views
6

Ich habe eine Textdatei, die über 100.000 Zeilen enthält, die ich wöchentlich von SAP herunterladen. Es wird als Seiten heruntergeladen und jede Seite enthält den gleichen Header mit gestrichelter Linie. Ein minimales Beispiel mit zwei Seiten, die jeweils nur zwei Elemente enthalten, ist unten.Importieren einer Textdatei in R

------------------------------------------------------------ 
|date    |Material   |Description   | 
|----------------------------------------------------------| 
|10/04/2013  |WM.5597394  |PNEUMATIC   | 
|11/07/2013  |GB.D040790  |RING    | 
------------------------------------------------------------ 

------------------------------------------------------------ 
|date    |Material   |Description   | 
|----------------------------------------------------------| 
|08/06/2013  |WM.4M01004A05  |TOUCHEUR   | 
|08/06/2013  |WM.4M010108-1  |LEVER    | 
------------------------------------------------------------ 

was Ich mag würde, ist zu tun, um diese Datei in R mit nur einem Header importieren und ohne Strich-Linien. Ich habe versucht:

read.table("myfile.txt", sep = "|", fill=TRUE) 

Vielen Dank

+1

ist das Beispiel der Inhalt eines einzelnen oder von zwei Dateien? –

+0

Alle Zeilen sind in einer einzigen Textdatei enthalten –

Antwort

7

ein weiterer readLines Ansatz:

l <- readLines("myfile.txt") 

# remove unnecessary lines 
l <- grep("^\\|?-+\\|?$|^$", l, value = TRUE, invert = TRUE) 

# remove duplicated headers 
l2 <- c(l[1], l[-1][l[-1] != l[1]]) 

# split 
lsplit <- strsplit(l2, "\\s*\\|") 

# create data frame 
dat <- setNames(data.frame(do.call(rbind, lsplit[-1])[ , -1]), lsplit[[1]][-1]) 


     date  Material Description 
1 10/04/2013 WM.5597394 PNEUMATIC 
2 11/07/2013 GB.D040790  RING 
3 08/06/2013 WM.4M01004A05 TOUCHEUR 
4 08/06/2013 WM.4M010108-1  LEVER 
2

können Sie verwenden readLines und read.table (nicht sehr effizient sein):

ll <- readLines(textConnection(txt)) 
dat <- read.table(text=ll[!grepl('--',ll)],sep='|',header=TRUE)[,-c(1,5)] 
dat[!grepl('date',dat$date),] 
      date   Material   Description 
1 10/04/2013   WM.5597394   PNEUMATIC   
2 11/07/2013   GB.D040790   RING     
4 08/06/2013   WM.4M01004A05  TOUCHEUR    
5 08/06/2013   WM.4M010108-1  LEVER 
+0

Wie kann ich die Datei "myfile.txt" –

+0

lesen Es filtert "WM.4M010108-1" – redmode

+0

@redmode guten Fang. Ich befestige es . – agstudy

3

Sie können Datei wie Text vorverarbeitet, dann verwenden read.table:

lines <- readLines("myfile.txt") 
lines <- sapply(lines, gsub, pattern="[-]{2,}|[|]", replacement="") 
lines <- c(lines[2], lines[lines!="" & lines!=lines[2]]) 

read.table(text=lines, header=T) 

ergibt

 date  Material Description 
1 10/04/2013 WM.5597394 PNEUMATIC 
2 11/07/2013 GB.D040790  RING 
3 08/06/2013 WM.4M01004A05 TOUCHEUR 
4 08/06/2013 WM.4M010108-1  LEVER 
-1

Möglicherweise müssen Sie eine benutzerdefinierte Funktion read.file() schreiben. Ich schlage vor, mit Scan(), lesen Sie jede Zeile als ein Element eines Vektors und dann manipuliert jede Zeile nach seinem Inhalt

1

Wie von den anderen Antworten zu beginnen, ist readLines die Art und Weise

sap <- readLines("myfile.txt") 
sap <- gsub("(^\\||\\|$|\\-{2,}|\\s+)", "", sap) 
sap <- sap[nchar(sap) > 0] 
ind <- grep("^date", sap) 
header <- sap[ind] 
header <- unique(unlist(strsplit(header, "\\|"))) 
sap <- sap[-ind] 

sap <- read.table(text = sap, sep = "|", 
        col.names = header, 
        stringsAsFactors = FALSE) 
str(sap) 
##   date  Material Description 
## 1 10/04/2013 WM.5597394 PNEUMATIC 
## 2 11/07/2013 GB.D040790  RING 
## 3 08/06/2013 WM.4M01004A05 TOUCHEUR 
## 4 08/06/2013 WM.4M0101081-1  LEVER 
zu gehen
+0

Es entfernt "-" in Material Spalte, letzte Zeile – redmode

+0

Guter Fang. Ich habe meine Antwort bearbeitet – dickoa

Verwandte Themen