2014-01-14 167 views
6

我有一个文本文件,其中包含超过100,000行,每周从SAP下载。它以页面形式下载,每个页面包含与虚线相同的标题。下面是一个包含两个页面的最小示例。将文本文件导入到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    | 
------------------------------------------------------------ 

我想要做的就是将这个文件导入R只有一个头和虚线。我想:

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

非常感谢

+1

是该例子的一个或两个文件的内容? –

+0

所有行都包含在一个文本文件中 –

回答

7

另一个readLines方法:

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

您可以使用readLinesread.table(可能不是很有效):

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

如何读取文件“myfile.txt” –

+0

它过滤器'WM.4M010108-1' – redmode

+0

@redmode良好的捕获。我修复它 。 – agstudy

3

您可以预先处理的文件,如文本,然后使用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) 

给出

 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

您可能必须编写自定义的read.file()函数。 我建议开始与扫描(),读每一行作为一个向量的元素,然后根据其内容

1

作为由他人回答指出操纵的每一行,readLines是去

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 
的方式
+0

它删除材料栏中的“ - ”,最后一行 – redmode

+0

良好的捕获。我编辑了我的答案 – dickoa