2017-05-04 3 views
1

Ich bin ein Anfänger in R, und ich habe eine große txt-Datei wie folgt:R wie Textdatei zu lesen, basierend auf Zustand

1: 
123,3,2002-09-06 
456,2,2005-08-13 
789,4,2001-09-20 
2: 
123,5,2003-05-08 
321,1,2004-06-15 
432,3,2001-09-11 

die Zeile mit ‚:‘ ist die itemID, die folgenden Zeilen UserID sind, Menge und Datum

ich es in data.frame wie diese lesen wollen:

itemID UserID Quantity Date 
    1  123 3  2002-09-06 
    1  456 2  2005-08-13 
    1  789 4  2001-09-20 
    2  123 5  2003-05-08 
    2  321 1  2004-06-15 
    2  432 3  2001-09-11 

Kann es durch die Verwendung read.csv erreicht werden? Oder wie liest man diese Datei nach Bedingung?

Jede Hilfe wird geschätzt.

Antwort

2

read.table() wird nicht in der Lage sein, dies leicht zu lesen. R erwartet, dass die meisten Daten sauber und rechteckig sind.

Sie können die Daten als eine Reihe von Zeilen lesen, diese Zeilen in ein reguläreres Format ändern und dann das mit read.table analysieren. Zum Beispiel

# Read your data file 
# xx <- readLines("mydatafile.txt") 
# for the sake of a complete example 
xx <- scan(text="1: 
123,3,2002-09-06 
456,2,2005-08-13 
789,4,2001-09-20 
2: 
123,5,2003-05-08 
321,1,2004-06-15 
432,3,2001-09-11", what=character()) 

Dies liest die Zeilen als nur Zeichenfolgen ein. Dann können Sie in Gruppen aufgeteilt und die Artikel-ID als ein anderer Wert an jede Zeile anhängen

item_group <- cumsum(grepl("\\d+:", xx)) 
clean_rows <- unlist(lapply(split(xx, item_group), function(x) { 
    item_id = gsub(":$",",", x[1]) 
    paste0(item_id, x[-1]) 
})) 

Dann können Sie die Daten in ein data.frame analysieren

read.table(text=clean_rows, sep=",", col.names=c("itemID","UserID","Quantity","Date")) 
+0

So befindet sich, wenn Sie aus einer Datei lesen können Sie den Scan-Befehl ändern wie damit . ............................................ 'scan (file =" tempo \ tempo.txt ", was = zeichen())' – DashingQuark

+0

Danke, es funktioniert! – Joe

0

Hier eine Lösung ist. Es ist ziemlich Handbuch und es gibt eine Menge in diesem Beispiel auspacken ...

separator_pattern <- "^(\\d+):\\s*$" 
block_text <- out <- NULL 
for(line in readLines(file("~/temp/example.txt"))){ 
    if(grepl(separator_pattern,line)){ 
     if(!is.null(block_text)){ 
      txt <- paste(c(paste0("column",1:3,collapse = ", "), block_text), collapse="\n") 
      tmp <- cbind("block" = block_no, read.csv(textConnection(txt))) 
      out <- rbind(out,tmp) 
     } 
     block_no <- as.numeric(gsub(separator_pattern,"\\1",line)) 
     print(block_no) 
     block_text <- character(0) 
    }else{ 
     block_text <- c(block_text,line) 
    } 
} 
txt <- paste(c(paste0("column",1:3,collapse = ", "), block_text), collapse="\n") 
tmp <- cbind("block" = block_no, read.csv(textConnection(txt))) 
out <- rbind(out,tmp) 

Offensichtlich geht davon aus, dass Ihre Datei in path.expand("~/temp/example.txt")

Verwandte Themen