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

时间:2018-10-23 20:34:11

标签: r csv 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"

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

尝试1

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

消息:

  

在前100行中找到并解决了不正确的报价。如果字段   不加引号(例如,字段分隔符不出现在任何   字段),请尝试quote =“”以避免此警告。检测到6个列名,但   数据有7列(即无效文件)。增加了1个默认值   第一列的列名可能是行名或   索引。如果此猜测不正确,请在之后使用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列(即无效   文件)。为第一列添加了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

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

1 个答案:

答案 0 :(得分:3)

您可以尝试预先清除数据,然后将双引号替换为单引号。

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

由于我不知道您的文件有多大,所以我无法确定这样做是否有效,但这可能是一种值得的方法。