2017-04-23 92 views
1

我有一個文本文件的目錄。我想將這些文本文件的內容逐行讀入R數據框。文本文件包含非結構化文本。期望的數據幀輸出是:將txt文件的目錄逐行讀入一個R數據框,並將文件名作爲一列

file; line 
1.txt; "line 1 in 1.txt" 
1.txt; "line 2 in 1.txt" 
2.txt; "line 1 in 2.txt" 
... 

我已經寫下面的代碼,但它會導致錯誤。我也猜想有一個更直接的方法來做到這一點,例如readrdplyr

files <- list.files(path="./data", pattern = "*.txt", full.names = TRUE) # read data folder txt files 

my_lines <-list() # create temp list for reading lines 
df <- data_frame("file" = character(0), "line" = character(0)) 

for (file in files){ 
    my_lines <- readLines(file) # read lines from file into a list 
    for (line in my_lines){ 
     df$file<-file 
     df$fline<-line 
    } 
} 
+0

這將有助於知道你得到哪些錯誤 –

+0

@MarcoSandri:'替換有1行,數據有0' – textnet

+0

你可以一次讀取整個文件,然後添加一個新的文件列。最後,你可以通過'rbind'或者'bind_rows'連接所有'data.frame's。 – mt1022

回答

1

不循環的替代解決方案:

> file = list.files(path="C:/...", pattern = "*.txt",full.names=T) 
> line = lapply(file,readLines) 
> file = unlist(mapply(rep,file,sapply(line,length),SIMPLIFY=FALSE,USE.NAMES=FALSE)) 
> df=data.frame(file=file,line=unlist(line)) 

設置full.namesTRUE使得相當長文件名... 如果您事先設置了工作目錄,則可以使用pathfull.names參數到list.files()將不是必需的,並且 您的數據幀將只包含實際沒有路徑的文件名。

1

一個簡單的(但效率不高)的解決方案是:

files <- list.files(path="./data", pattern = "*.txt", full.names = TRUE) 
fls <- NULL 
lns <- NULL 
for (file in files) { 
    my_lines <- readLines(file) 
    for (line in my_lines) { 
    fls <- c(fls, file) 
    lns <- c(lns, line) 
    } 
} 
df <- data.frame(file=fls, fline=lns) 
print(df) 

    file   fline 
1 1.txt line1_in_1.txt 
2 1.txt line2_in_1.txt 
3 2.txt line1_in_2.txt 
4 2.txt line2_in_2.txt 
相關問題