2017-05-01 81 views
1

我有一個包含逗號和雙引號的csv文件。但是,雙引號只有在字符串內有逗號時才使用。就像這樣:CSV文件中的逗號和雙引號

AAA, BBB, "ACB,BCA", 123, "1,987" 
DDC, CHA, ACH;HDC, "2,34", 192 

我不想解析逗號雙引號,並想有以下輸出:

x1 x2 x3  x4 x5 
AAA BBB ACB,BCA 123 1,987 
DDC CHA ACH;HDC 2,34 192 

總之,忽略逗號與雙值引號並考慮不帶雙引號的值的逗號。

我使用這多個CSV文件合併成一個CSV文件,同時增加了一些列指的是文件名:

with open(outfile, "wb") as outfile: 
    writer = None 
    for input_filename in filenames: 
     with open(input_filename, "rb") as infile: 
      reader = csv.DictReader(infile, quotechar='"', delimiter=',') 
      if writer is None: 
       field_names = ["index1"] + ["index2"] + reader.fieldnames 
       writer = csv.DictWriter(outfile, field_names) 
       writer.writeheader() 
      for row in reader: 
       row["index1"] = input_filename[1:10] 
       row["index2"] = input_filename[10:20] 
       writer.writerow(row) 

我閱讀的CSV的具體方案是:

csv.DictReader(infile, quotechar='"', delimiter=',') 

但這顯然不起作用。

有什麼建議嗎?

編輯:下面一個更好的例子:

我試圖打開CSV文件的結構是這樣的:

x 1,x 2,x 3,x 4,x5 AAA, 「BB,B」, CCC, DDD, EEE AA1, B;B2, CC3, DD4, EE5 

我已經試過解析器到目前爲止,csv.DictReader,PD .read_csv或csv.reader似乎讀取「;」在B中; B2作爲行斷路器,它混淆了以下所有的列。

下面的代碼解決了「BB,B」的問題,但仍打破了B; B2到一個新行

csv.reader(fileObject, quotechar='"', delimiter=',', 
      quoting=csv.QUOTE_ALL, skipinitialspace=True) 
+0

* - 不是嗎?它做什麼呢? 'DictReader'需要頭文件,你有沒有試過提供這些頭文件?否則,你只會得到一行,'{'AAA':'DDC',''ACB':'ACH; HDC','987'':無,'BBB':'CHA','BCA'': ''2','123':'34''','1':'192'}'。 – jonrsharpe

+0

我認爲fieldname對讀者來說是可選的,但是在我寫的時候,它將大多數情況放到了正確的列中。除了在x3欄中的那些。它適用於x3中的「ACB,BCA」,但在看到ACH時跳躍到行; HDC。 – tan

+0

如果第一行是標題,則它是可選的;在您的示例中,您沒有顯示它。給出一個[mcve];例如,只是打印讀取的行可能就足夠了,而不顯示輸出寫入器的細節。 – jonrsharpe

回答

0

下面的代碼片段仍然爲我工作,並在沒有突破「;」符號

csv.DictReader(fileObject, quotechar='"', delimiter=',', 
       quoting=csv.QUOTE_ALL, skipinitialspace=True) 

已經爲我工作了。

這是我收到的輸出: 「明確不起作用」

{'x1': 'AAA', 'x2': 'BBB', 'x4': '123', 'x5': '1,987', 'x3': 'ACB,BCA'} 
{'x1': 'DDC', 'x2': 'CHA', 'x4': '2,34', 'x5': '192', 'x3': 'ACH;HDC'} 
+0

csv.DictReader也可以使用相同的參數,我測試了它,並且在過程中知道了.DictReader()函數的實用程序。:) –

相關問題