2013-02-13 56 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將默認爲「創先爭優」的方言,所以它在不需要的時候不會寫逗號