2013-02-13 54 views
0

我完全丧失了如何执行此操作。如果不包含逗号,则表示前导和尾部正则表达式

我的问题:我想借此:

"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中做一个完整的项目或者任何需要处理的东西。

任何帮助,非常感谢!

+3

确定只有*需要*引号,如果有逗号,但是是通讯因为实际上导致问题? – 2013-02-13 02:56:38

+0

@AndrewWhitaker是的,当我将它加载到Excel中时,它无法正常显示。我的意思是它显示了第一个单元格中的所有内容。 – kentcdodds 2013-02-13 02:58:22

+0

在python中,将数据提供给'csv'并用“excel”方言写回来,即可删除引号,如果这是你想要的。 – 2013-02-13 03:07:28

回答

3

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

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

这里有更多的信息:

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

编辑

您也可以尝试从重命名文件* .TXT到* .csv格式。这将改变Excel读取文件的方式,因此它更好地理解如何解析内部发现的任何内容。

+0

尝试了重命名。 – kentcdodds 2013-02-13 03:07:28

+0

完全合作。谢谢! – kentcdodds 2013-02-13 03:09:26

+0

对重命名的精神阅读干得不错! – 2013-02-13 03:14:10

0

如果只是扑是一个选项,你可以在一个终端尝试这一个班轮:

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

我得到一个错误: cat“Report(max)out.txt”| sed's /“\([^,] * \)”/ \ 1/g'>> new-file.csv sed:RE错误:非法字节序列 – kentcdodds 2013-02-13 03:09:55

+0

您是否确定使用\和\),而不仅仅是(和)?如果你不逃避那些,那么这个序列就被视为纯文本的parens,而不是捕获包含在parens中的参数,而\ 1(它应该评估为第一个捕获的参数)将无法评估。 – RustyBuckets 2013-02-13 03:35:43

0

,在技术上应该罚款。这是由文本分隔的“,并通过分隔, 我没有看到任何错误的第一个,任何领域可能会被引用,只有一些需要它。更可能的代码的作者不希望逻辑和引用所做的一切变得复杂。

0

一种方式把它清理干净是将数据提供给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将默认为“创先争优”的方言,所以它在不需要的时候不会写逗号