【问题标题】:Regex out leading and trailing quotes if not contains comma如果不包含逗号,则正则表达式输出前导和尾随引号
【发布时间】:2013-01-28 12:47:44
【问题描述】:

我完全不知道如何做到这一点。

我的问题:我想接受这个:

"A, two words with comma","B","C word without comma","D"
"E, two words with comma","F","G more stuff","H no commas here!"
... (continue)

到这里:

"A, two words with comma",B,C word without comma,D
"E, two words with comma",F,G more stuff,H no commas here!
... (continue)

我使用的软件在文本文件中创建了 1,900 条记录,我认为它应该是 CSV,但编写该软件的人不知道 CSV 文件的工作原理,因为它只需要在单元格包含逗号时使用引号(对?)。至少我知道在 Excel 中它会将所有内容都放在第一个单元格中...

我希望这可以使用某种命令行工具(如 perl 或 python)来解决(我在 Mac 上)。我不想用 Java 或任何东西来处理这个问题。

非常感谢任何帮助!

【问题讨论】:

  • 如果有逗号,当然只有需要引号,但逗号真的会导致问题吗?
  • @AndrewWhitaker 是的,当我将它加载到 Excel 中时,它无法正确显示。我的意思是它显示了第一个单元格中的所有内容。
  • 在 python 中,将数据提供给csv 并用“excel”方言将其写回,这样就可以去掉引号。
  • @AttilaO。 - 你应该发布一个答案。我认为这就是 OP 想要的......
  • “第一个单元格的所有内容”?你的意思是包括引号?在 Excel 中打开时,您的两个示例都会产生完全相同相同的数据。在 Excel 中打开时,所有单元格都没有引号。请显示您的实际数据,或描述您实际看到的行为。

标签: python regex perl excel csv


【解决方案1】:

这里在黑暗中拍摄,但我认为 Excel 将所有内容都放在第一列,因为它不知道它被赋予逗号分隔的数据。

Excel 具有“文本到列”功能,您可以在其中通过分隔符拆分列(确保选择逗号)。

这里有更多信息:

http://support.microsoft.com/kb/214261

编辑

您也可以尝试将文件从 *.txt 重命名为 *.csv。这将改变 Excel 读取文件的方式,因此它可以更好地理解如何解析它在其中找到的任何内容。

【讨论】:

    【解决方案2】:

    如果只是 bashing 是一种选择,您可以在终端中尝试这种单线:

    cat file.csv | sed 's/"\([^,]*\)"/\1/g' >> new-file.csv
    

    【讨论】:

    • 我收到一个错误:cat "Report (max) out.txt" | sed 's/"([^,]*)"/\1/g' >> new-file.csv sed: RE 错误:非法字节序列
    • 您是否确保使用 (and) 而不是仅使用 (and) 来转义括号?如果您不转义这些,则序列将被视为纯文本括号,而不是捕获括号中包含的参数,并且 \1 (应评估为第一个捕获的参数)将无法评估。
    【解决方案3】:

    技术上应该没问题。它是用 " 分隔并通过 , 分隔的文本 我看不出第一个有什么问题,任何字段都可以被引用,只有一些需要它。代码的编写者很可能不想使逻辑过于复杂并引用所有内容。

    【讨论】:

      【解决方案4】:

      清理它的一种方法是将数据提供给csv 并将其转储。

      import csv
      from cStringIO import StringIO
      
      bad_data = """\
      "A, two words with comma","B","C word without comma","D"
      "E, two words with comma","F","G more stuff","H no commas here!"
      """
      
      buffer = StringIO()
      writer = csv.writer(buffer)
      writer.writerows(csv.reader(bad_data.split('\n')))
      
      buffer.seek(0)
      print buffer.read()
      

      Python的csv.writer会默认为“excel”方言,所以不需要的时候不会写逗号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-07
        相关资源
        最近更新 更多