代码之家  ›  专栏  ›  技术社区  ›  Samuel

读取带有双引号和逗号的CSV文件

  •  4
  • Samuel  · 技术社区  · 7 年前

    我正试图使用fread()函数从data.table包中读取一个脏的CSV文件,但是在字符串值中嵌入了双引号和逗号,也就是说,引号字段中存在未替换的双引号。下面的示例数据说明了我的问题。它由3行6列组成,第一行包含列名:

    "SA","SU","CC","CN","POC","PAC"
    "NE","R","000","H "B", O","1","8"
    "A","A","000","P","E,5","8"
    

    第一个问题出现在第2行,其中嵌入了一对双引号和一个逗号: "H "B", O" . 第二个问题在第3行,双引号中有一个逗号: "E,5" . 我尝试了以下方法:

    library(data.table)
    x1 <- fread(file = "example.csv", quote = "\"")
    

    输出:

    > x1
         V1 "SA" "SU"   "CC" "CN" "POC" "PAC"
    1: "NE"  "R"    0 "H "B"   O"   "1"     8
    2:  "A"  "A"    0    "P"   "E    5"     8
    

    不带引号(例如,字段分隔符不出现在任何 字段),请尝试引用“”以避免此警告。检测到6个列名,但 猜测为行名或 索引。如果此猜测不正确,请在后面使用setnames(),或者 修复创建文件的文件写入命令以创建有效的 文件。

    结论:结果不正确,因为它增加了一个新的列 V1

    尝试2

    x2 <- fread(file = "example.csv", quote = "")
    

    输出:

    > x2
         V1 "SA"  "SU"   "CC" "CN" "POC" "PAC"
    1: "NE"  "R" "000" "H "B"   O"   "1"   "8"
    2:  "A"  "A" "000"    "P"   "E    5"   "8"
    

    信息:

    检测到6列名称,但数据有7列(即无效 猜测为行名或索引。如果出现以下情况,请在后面使用setnames() 猜测不正确,或者修复创建

    ..

    我要寻找的是一种方法,以获得类似的输出

    > x3
       SA SU CC       CN POC PAC
    1: NE  R  0 H 'B', O   1   8
    2:  A  A  0        P E,5   8
    

    1 回复  |  直到 7 年前
        1
  •  3
  •   tblznbits    7 年前

    您可以尝试事先清理数据,并用单引号替换双引号。

    x = readLines('my_file.csv')
    y = gsub('","', "','", x) # replace double quotes for each field
    y = gsub('^"|"$', "'", y) # replace trailing and leading double quotes
    z = paste(y, collapse='\n') # turn it back into a table for fread to read
    df = fread(z, quote="'")
    df
    
       SA SU CC       CN POC PAC
    1: NE  R  0 H "B", O   1   8
    2:  A  A  0        P E,5   8
    

    我不能确定这是有效的,因为我不知道你的文件有多大,但这可能是一个值得的方法。