我正在尝试使用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(),但也欢迎其他建议。
您可以尝试事先清理数据并将双引号替换为单引号。
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)
我无法确认这是否有效,因为我不知道您的文件有多大,但这可能是一种值得的方法。