[英]Importing a text file into R
我有一個文本文件,其中包含超過100,000行,我每周從SAP下載。 它被下載為頁面,每個頁面包含相同的標題和虛線。 下面是一個包含兩個頁面的最小示例,每個頁面只包含兩個項目
------------------------------------------------------------
|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)
非常感謝
另一種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
您可以像文本一樣預處理文件,然后使用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
您可以使用readLines
和read.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
正如其他人的回答所指出的, 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
您可能必須編寫自定義的read.file()函數。 我建議從scan()開始,將每一行作為向量的元素讀取,然后根據其內容操作每一行
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.