使用不匹配的引号读取文本文件

时间:2013-07-31 18:54:23

标签: r csv

我有一个大的(> 1GB)CSV文件我试图读入R中的数据框。

非数字字段用双引号括起来,因此内部逗号不会被解释为分隔符。这很好,也很好。但是,条目中有时也会出现无法匹配的双引号,例如"2" Nails"

解决此问题的最佳方法是什么?我目前的计划是使用像awk这样的文本处理器将双引号"中的引号字符重新标记为管道|之类的非冲突字符。我找到引号字符的启发式方法是逗号旁边的双引号:

gawk '{gsub(/(^\")|(\"$)/,"|");gsub(/,\"/,",|");gsub(/\",/,"|,");print;}' myfile.txt > newfile.txt 

This question是相关的,但解决方案(read.csv的{​​{1}}中的参数)对我来说不可行,因为我的文件在引号中包含非分隔符号。

2 个答案:

答案 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

我不确定它是否会出现任何错误。