【问题标题】:How to read a file in the following format如何读取以下格式的文件
【发布时间】:2017-12-12 01:23:25
【问题描述】:

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

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

使用数据表

temp <- fread(input="LIKP_01012017_01312017.txt",  
              stringsAsFactors=FALSE, strip.white=TRUE, 
              sep="|",quote = "-", skip=1)

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

提前致谢。

萨蒂什

【问题讨论】:

  • | 分隔的文件称为 PSV(管道分隔值),类似于 CSV 或 TSV(制表符分隔)。而我们忽略的------------------ 行。可能会进行一次预处理以删除它们。第 1-3 行是您的标题,但只有第 2 行有意义。

标签: r csv file-format read.csv


【解决方案1】:

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|    |
------------------------------------------------"

【讨论】:

  • 也许可以解释一下comment.char 的技巧,以及为什么这真的可以节省一天的时间 +1。
  • 您好,格洛腾迪克先生:感谢您的建议。我的文件非常大 > 90 MB,其中大约 25 个。所以,我想知道我怎样才能听从你的建议?谢谢,萨蒂什
  • 最简单的就是尝试一下。
【解决方案2】:

您可以使用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循环来一一转换和读取所有文件。

【讨论】:

  • OP 是一种功能齐全的编程语言,具有sed 的功能。这没有任何意义。
【解决方案3】:

不同的方法:

con <- file('path/to/file.txt')

d <- readLines(con)

d <- read.delim(textConnection(d[!grepl("-", d)]), sep = '|')[2:6]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多