我有一个大的(> 1GB)CSV文件我试图读入R中的数据框。
非数字字段用双引号括起来,因此内部逗号不会被解释为分隔符。这很好,也很好。但是,条目中有时也会出现无法匹配的双引号,例如"2" Nails"
。
解决此问题的最佳方法是什么?我目前的计划是使用像awk这样的文本处理器将双引号"
中的引号字符重新标记为管道|
之类的非冲突字符。我找到引号字符的启发式方法是逗号旁边的双引号:
gawk '{gsub(/(^\")|(\"$)/,"|");gsub(/,\"/,",|");gsub(/\",/,"|,");print;}' myfile.txt > newfile.txt
This question是相关的,但解决方案(read.csv
的{{1}}中的参数)对我来说不可行,因为我的文件在引号中包含非分隔符号。
答案 0 :(得分:2)
您在逗号旁边寻找引号的想法可能是您可以做的最好的事情;但是你可以试着转过来让正则表达式转义逗号旁边的所有引号 not (或行的开头/结尾):
搜索
(?<!^|,)"(?!,|$)
并将所有匹配项替换为""
。
R可能不是最好的工具,因为它的正则表达式引擎没有多线模式,但在Perl中它可能是单行的:
$subject =~ s/(?<!^|,)"(?!,|$)/""/mg;
答案 1 :(得分:0)
如果单元格内存在非边界逗号,这将是蒂姆解决方案的更简单的变体:
df1 <- data.frame(Pclass = rep(LETTERS[1:3], each = 3),
Age = 1:9)
df1$Age[c(FALSE, TRUE, FALSE)] <- NA
df1
# Pclass Age
# 1 A 1
# 2 A NA
# 3 A 3
# 4 B 4
# 5 B NA
# 6 B 6
# 7 C 7
# 8 C NA
# 9 C 9
我不确定它是否会出现任何错误。