【问题标题】:Read comma separated csv file with fields containing commas using fread in r使用 r 中的 fread 读取逗号分隔的 csv 文件,其中包含逗号的字段
【发布时间】:2021-06-16 10:00:41
【问题描述】:

我有一个用逗号分隔的 csv 文件。但是,有些字段包含逗号,例如公司名称“Apple,Inc”,并且字段将分为两列,这会导致使用 fread 时出现以下错误。

“在第 5 行提前停止。预期有 26 个字段,但找到了 27 个。”

关于如何正确加载此文件的任何建议?提前致谢!

添加:

示例行如下。似乎有些字段带有逗号而没有引号。但是它们在字段内的逗号后面有空格。

100,Microsoft,azure.com
300,IBM,ibm.com
500,Google,google.com
100,Amazon, Inc,amazon.com
400,"SAP, Inc",sap.com

【问题讨论】:

  • 如果字段不受某种引号保护,除非有其他可以利用的结构,否则您有点搞砸了...您可以发布一个简短/可重现的示例(例如一个代码格式的文本块)?文件有多大(这将决定各种 hacks/workarounds 的实用性)?
  • 谢谢本!字段内的逗号后跟一个空格。文件不是很大。我想我可能需要将列分隔符更改为分号。
  • 如果有些字段没有带逗号的引号 (Amazon, Inc),您如何知道它们应该是一个字段?如果您想根据空白调整它们,您需要使用readLines 阅读它们并进行一些文本处理。
  • 如果更改分隔符是(到目前为止)最简单的选项...

标签: r csv data.table fread comma


【解决方案1】:

1) 使用最后在注释中创建的测试文件,并假设该文件在行中没有分号(如果有,请使用其他字符),替换第一个和最后一个逗号加分号,然后将其作为分号分隔的文件读取。

L <- readLines("firms.csv")
read.table(text = sub(",(.*),", ";\\1;", L), sep = ";")
##    V1          V2         V3
## 1 100   Microsoft  azure.com
## 2 300         IBM    ibm.com
## 3 500      Google google.com
## 4 100 Amazon, Inc amazon.com
## 5 400    SAP, Inc    sap.com

2) 另一种方法是使用 gsub 将每个逗号后跟空格替换为分号后跟空格,然后使用 chartr 将每个逗号替换为分号,每个分号替换为逗号,然后将其读入 以分号分隔的文件。

L <- readLines("firms.csv")
read.table(text = chartr(",;", ";,", gsub(", ", "; ", L)), sep = ";")
##    V1          V2         V3
## 1 100   Microsoft  azure.com
## 2 300         IBM    ibm.com
## 3 500      Google google.com
## 4 100 Amazon, Inc amazon.com
## 5 400    SAP, Inc    sap.com

3) 如果没有太多这样的行,另一种可能性是找到它们,然后在文本编辑器中为有问题的字段加上引号。然后就可以正常读入了。

which(count.fields("firms.csv", sep = ",") != 3)
## [1] 4

注意

Lines <- '100,Microsoft,azure.com
300,IBM,ibm.com
500,Google,google.com
100,Amazon, Inc,amazon.com
400,"SAP, Inc",sap.com
'
cat(Lines, file = "firms.csv")

【讨论】:

    【解决方案2】:

    对我来说很好用。你能提供一个可重现的例子吗?

    library(data.table)
    
    # Create example and write out
    df_out <- data.frame("X" = c("A", "B", "C"),
                         "Y"= c("a,A", "b,B", "C"))
    
    write.csv(df_out, file = "df.csv", row.names = F)
    
    # Read in CSV with fread
    df_in <- fread("./df.csv")
    df_in
    
       X   Y
    1: A a,A
    2: B b,B
    3: C   C
    

    【讨论】:

    • 感谢 AdamK!有些字段没有引号,但里面有逗号。这应该是错误消息的问题。
    • Yes.Warning message: In fread("~/Desktop/fread_sample.txt", header = F) : 在第 4 行提前停止。预期 3 个字段,但找到 4。考虑 fill=TRUE 并注释.char=。第一个丢弃的非空行:>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多