Python 正则表达式输出前导和尾随引号(如果不包含逗号)

Python 正则表达式输出前导和尾随引号(如果不包含逗号),python,regex,perl,excel,csv,Python,Regex,Perl,Excel,Csv,我完全不知道该怎么做 我的问题:我想回答这个问题: "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 m

我完全不知道该怎么做

我的问题:我想回答这个问题:

"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)
我使用的软件在一个文本文件中创建了1900条记录,我认为它应该是一个CSV,但编写该软件的人不知道CSV文件是如何工作的,因为它只需要在单元格包含逗号时使用引号(对吗?)。至少我知道,在Excel中,它将所有内容都放在第一个单元格中

我更喜欢使用某种命令行工具,如perl或python(我在Mac上)来解决这个问题。我不想用Java或任何东西来完成整个项目


非常感谢您的帮助

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

Excel有一个“文本到列”功能,您可以使用分隔符拆分列(确保选择逗号)

这里有更多信息:

编辑


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

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

Excel有一个“文本到列”功能,您可以使用分隔符拆分列(确保选择逗号)

这里有更多信息:

编辑


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

如果只是猛击是一个选项,您可以在终端中尝试以下一行:

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

如果只是猛击是一种选择,您可以在终端中尝试以下一种方式:

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

从技术上讲,这应该没问题。文本以“分隔,并通过,
我认为第一个字段没有任何错误,任何字段都可以引用,只有一些字段需要引用。很可能代码编写者不想让逻辑过于复杂,而是引用了所有内容。

从技术上讲,这应该没问题。它是以“分隔的文本,通过,
我不认为第一个字段有任何错误,任何字段都可以引用,只有一些字段需要引用。很可能代码编写者不想让逻辑过于复杂,并引用了所有内容。

清理它的一种方法是将数据反馈到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将默认使用“excel”方言,因此在不需要时不会写入逗号。

清理它的一种方法是将数据馈送到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将默认为“excel”方言,因此在不需要时不会写入逗号。

确定如果有逗号,它只需要引号,但逗号是否确实会导致问题?@AndrewHitaker是的,当我将其加载到excel中时,它不会正确显示。我的意思是,它显示第一个单元格中的所有内容。在python中,将数据馈送到
csv
,然后用“excel”方言将其写出来,如果您需要的话,就可以去掉引号。@AttilaO。--你应该发布一个答案。我想这就是OP想要的…“第一个单元格的所有内容”?你的意思是包括报价?在Excel中打开时,两个示例产生的数据完全相同。在Excel中打开时,所有单元格都没有引号。请显示您的实际数据,或描述您实际看到的行为。确定只有在有逗号的情况下才需要引号,但逗号是否确实会导致问题?@AndrewHitaker是的,当我将其加载到Excel时,它不会正确显示。我的意思是,它显示第一个单元格中的所有内容。在python中,将数据馈送到
csv
,然后用“excel”方言将其写出来,如果您需要的话,就可以去掉引号。@AttilaO。--你应该发布一个答案。我想这就是OP想要的…“第一个单元格的所有内容”?你的意思是包括报价?在Excel中打开时,两个示例产生的数据完全相同。在Excel中打开时,所有单元格都没有引号。请显示您的实际数据,或者描述您实际看到的行为。我收到一个错误:cat“Report(max)out.txt”| sed's/“([^,]*)”/\1/g'>>new-file.csv sed:re错误:非法字节序列您是否确保使用(and)而不是仅仅使用(and)来转义括号?如果不转义这些参数,则序列将被视为纯文本参数,而不是捕获包含在参数中的参数,并且\1(应计算为第一个捕获的参数)将无法计算。我收到一个错误:cat“Report(max)out.txt”| sed's/([^,]*)”/\1/g'>>new-file.csv sed:RE错误:非法字节序列是否确保使用(and)而不是仅使用(and)来转义括号?如果不转义这些参数,则序列将被视为纯文本参数,而不是捕获包含在参数中的参数,并且\1(应计算为第一个捕获的参数)将无法计算。