如何以下列格式读取文件

时间:2017-12-12 01:23:25

标签: r csv file-format read.csv

我有很多想要阅读的文件。文件的格式如下所示。

我尝试了很多包格式来阅读它,但它们似乎都不起作用。应跳过以“ - ”开头的行。文件中大约有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)

显然我做的不对。你能帮我阅读这些文件吗?

提前致谢。

萨蒂什南比亚

3 个答案:

答案 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]