我有很多想要阅读的文件。文件的格式如下所示。
我尝试了很多包格式来阅读它,但它们似乎都不起作用。应跳过以“ - ”开头的行。文件中大约有102列,但我只显示了几列。以“ - ”开头的行实际上位于第1行,第3行和最后一行。
文件格式如下
------------------------------------------------
|Delivery |Created by |Time |Created on|SDst|
------------------------------------------------
|84181375 |BATCHJOBMGR|19:33:47|01/05/2017| |
|84181376 |BATCHJOBMGR|19:33:47|01/05/2017| |
------------------------------------------------
我尝试了以下内容:
使用read.table
temp <- read.delim(file="LIKP_01012016_01312016.txt", header=TRUE,
stringsAsFactors=FALSE,
strip.white=TRUE, sep="|", skip = 1, comment.char = "-")
使用data.table
temp <- fread(input="LIKP_01012017_01312017.txt",
stringsAsFactors=FALSE, strip.white=TRUE,
sep="|",quote = "-", skip=1)
显然我做的不对。你能帮我阅读这些文件吗?
提前致谢。
萨蒂什南比亚
答案 0 :(得分:5)
1)在样本数据中,唯一的减号以虚线表示。如果您的真实数据也是如此,则以下内容应该有效。将text = Lines
替换为"LIKP_01012016_01312016.txt"
。请注意,comment.char = "-"
会导致任何带有减号的行具有该减号,并且忽略其后面的所有内容,从而有效地将缺少的行转换为空行。
read.table(text = Lines, header = TRUE, sep = "|", as.is = TRUE,
comment.char = "-", check.names = FALSE, strip.white = TRUE)[2:6]
,并提供:
Delivery Created by Time Created on SDst
1 84181375 BATCHJOBMGR 19:33:47 01/05/2017 NA
2 84181376 BATCHJOBMGR 19:33:47 01/05/2017 NA
2 如果数据中确实有减号,则只需跳过第一行,使用fill = TRUE
并删除第一行和最后一行(其余为所有减号的行) )。
DF <- read.table(text = Lines, header = TRUE, sep = "|", as.is = TRUE,
skip = 1, fill = TRUE, check.names = FALSE, strip.white = TRUE)[2:6]
n <- nrow(DF)
DF <- DF[-c(1, n), ]
注意:上述代码的输入为:
Lines <- "------------------------------------------------
|Delivery |Created by |Time |Created on|SDst|
------------------------------------------------
|84181375 |BATCHJOBMGR|19:33:47|01/05/2017| |
|84181376 |BATCHJOBMGR|19:33:47|01/05/2017| |
------------------------------------------------"
答案 1 :(得分:0)
您可以使用system()
命令更正每个输入文件。以下是使用sed
实用程序的Linux。以-
开头的所有行都将被删除(sed '/^-/d'
)。此外,还删除了所有前导和尾随管道(|
)字符(sed 's/^|//'
和sed 's/|$//'
)。输出可以保存到临时文件中,可以使用通常的read.csv
命令读取,将分隔符指定为|
:
> system("cat LIKP_01012016_01312016.txt | sed '/^-/d' | sed 's/^|//' | sed 's/|$//' > temp.csv")
> dd = read.csv('temp.csv', na.strings='', sep="|")
> dd
Delivery Created.by Time Created.on SDst
1 84181375 BATCHJOBMGR 19:33:47 01/05/2017 NA
2 84181376 BATCHJOBMGR 19:33:47 01/05/2017 NA
上面可以放在for
循环中,逐个转换和读取所有文件。
答案 2 :(得分:0)
不同的方法:
con <- file('path/to/file.txt')
d <- readLines(con)
d <- read.delim(textConnection(d[!grepl("-", d)]), sep = '|')[2:6]