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

jsb*_*jsb 5 csv r data.table

我正在尝试使用data.table包中的fread()函数读取肮脏的CSV文件,但字符串值中嵌入的双引号和逗号存在问题,即引号字段中存在未转义的双引号。以下示例数据说明了我的问题。它由3行/行和6列组成,第一行包含列名:

"SA","SU","CC","CN","POC","PAC"
"NE","R","000","H "B", O","1","8"
"A","A","000","P","E,5","8"
Run Code Online (Sandbox Code Playgroud)

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

尝试1

library(data.table)
x1 <- fread(file = "example.csv", quote = "\"")
Run Code Online (Sandbox Code Playgroud)

输出:

> 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
Run Code Online (Sandbox Code Playgroud)

信息:

在前100行中发现并解决了不正确的报价。如果未用引号引起来(例如,字段分隔符未出现在任何字段中),请尝试使用quote =“”以避免此警告。检测到6个列名,但数据具有7列(即无效文件)。为第一列添加了1个额外的默认列名称,该名称可能是行名或索引。如果此猜测不正确,请在以后使用setnames(),或修复创建该文件的文件写入命令以创建有效文件。

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

尝试2

x2 <- fread(file = "example.csv", quote = "")
Run Code Online (Sandbox Code Playgroud)

输出:

> 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"
Run Code Online (Sandbox Code Playgroud)

信息:

检测到6个列名,但数据有7列(即无效文件)。为第一列添加了1个额外的默认列名称,该名称可能是行名或索引。如果此猜测不正确,请在以后使用setnames(),或修复创建该文件的文件写入命令以创建有效文件。

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

解?

我正在寻找一种获得类似于输出的方法

> x3
   SA SU CC       CN POC PAC
1: NE  R  0 H 'B', O   1   8
2:  A  A  0        P E,5   8
Run Code Online (Sandbox Code Playgroud)

最好使用fread(),但也欢迎其他建议。

bri*_*enb 6

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

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
Run Code Online (Sandbox Code Playgroud)

我无法确认这是否有效,因为我不知道您的文件有多大,但这可能是一种值得的方法。

  • 我现在无法测试这个,因为我在 win10 上无法访问 *nix,但我认为它会类似于 `fread('my_file.csv', cmd="sed s/","/', '/g;s/^"|"$/'/g my_file.csv")`。**我强烈建议您在尝试此操作之前创建文件备份!** (2认同)