【问题标题】:Reading in text file with unmatched quotes读取带有不匹配引号的文本文件
【发布时间】:2013-07-31 18:54:23
【问题描述】:

我有一个大 (>1GB) CSV 文件,我正在尝试将其读入 R 中的数据框。

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

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

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

【问题讨论】:

  • 我看不出将所有“\””更改为“|”会有什么帮助。我认为您可能需要一个正则表达式解决方案(可能在 awk 中实现),它会找到以下实例: ","\"[^,]{0,}\"[^,]{0,}\"," ,即逗号之间的三个双引号。
  • @DWin 查看编辑。如果我将双引号改为管道,那么我可以在read.csv 中设置quote='|'
  • 您当然可以这样做,但您将遇到与当前遇到的相同的解析困难。在一个小测试用例上试一试。在您的测试用例中,会有两个有问题的双引号,一个在第一个双引号旁边。

标签: r csv


【解决方案1】:

在逗号旁边寻找引号的想法可能是您能做的最好的事情;但是,您可以尝试将其转过来并让正则表达式转义所有 not 逗号(或行首/行尾)旁边的引号:

搜索

(?<!^|,)"(?!,|$)

并将所有匹配项替换为""

R 可能不是最好的工具,因为它的正则表达式引擎没有多行模式,但在 Perl 中它将是单行模式:

$subject =~ s/(?<!^|,)"(?!,|$)/""/mg;

【讨论】:

  • 为什么需要多行选项?我在命令行中运行了这个:perl -p -e 's/(?&lt;!,)(?&lt;!^)"(?!,|$)/""/mg;' file1.csv &gt; file2.csv
  • 如果逐行运行命令行,则不需要多行选项。但是,如果您已将整个文件读入$subject,那么您确实需要它。
【解决方案2】:

如果单元格内存在非边界逗号,这将是蒂姆解决方案的一个更简单的变体:

(?<!,\s+)"(?!\s+,$)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-07
    • 2017-06-24
    • 2017-04-18
    • 2018-07-29
    • 2021-07-11
    • 1970-01-01
    • 2022-01-16
    • 2023-02-01
    相关资源
    最近更新 更多