2015-12-05 111 views
0

我目前正在從URL中拉取CSV文件並修改它的條目。我目前使用StreamReader來讀取CSV的每一行並將其分割成一個數組,我可以根據其位置修改每個條目。CSV解析時跳過空行

CSV是從電子表單提供程序生成的,其中特定表單條目是多行字段,用戶可以在其中添加多個筆記。但是,當用戶輸入新的筆記時,他們將通過換行來分隔每個筆記。

CSV示例:

"FName","LName","Email","Note 1: some text 

Note 2: some text" 

因爲我的代碼是通過分割線上的每個CSV項,一旦達到這些筆記,它認爲這是一個新的CSV條目。這導致我的代碼修改了條目不能工作,因爲元素位置變得不正確。 (具有空行或單行註釋字段的CSV條目工作正常)

任何關於最佳方法的想法?我嘗試添加代碼來替換回車或跳過空行,但它似乎沒有幫助。

+0

這不是一個有效的CSV文件,是否可以清除它? – Berger

+0

您可以使用'.split()'發佈您的Reader方法嗎? –

+0

@Berger爲什麼無效?它符合[RFC 4180](https://tools.ietf.org/html/rfc4180)。 – RealSkeptic

回答

0

您可以檢查行中的第一列值是否爲空。如果爲空,請繼續閱讀下一行。

+0

然後,「Note 2:some text」「行將被認爲是有效的,但它不是。 – Berger

0

假設您提供的CSV示例應該只是其中一個條目在CSV文件中(由於換行符會導致最後一個字段跨越多行),您可以使用2個循環。

  1. 保持變量爲當前CSV記錄currentRecord(的String[]型)和recordList(List或陣列),以保持所有的CSV記錄。
  2. 閱讀CSV文件的一行
  3. 使用逗號作爲分隔符將其拆分爲一個字符串數組。將此數組保存在一個臨時變量中。
  4. 如果此數組的大小爲1,則將此字符串追加到currentRecord中的最後一個元素(第4個)(如果currentRecord不爲空)。
  5. 將讀取的行從CSV文件中取出,並重復步驟4,直到數組大小爲4.
  6. 如果大小爲4,則表示該記錄是CSV文件中的下一條記錄,您可以添加currentRecordrecordList
  7. 不斷重複步驟2-6,直到你到達CSV文件的末尾

這將是更好,如果你能刪除領域的換行符,雖然分析前清理CSV文件。它會讓事情變得更簡單。

0

使用正確的CSV庫來處理寫入和解析。這裏有幾個邊緣案例,不僅僅是新線。用戶也可以在他們的筆記中插入逗號或引號,並且自己處理這些會變得非常混亂。

嘗試uniVocity-parsers,因爲它可以處理解析和寫入CSV時的各種情況。

披露:我是該圖書館的作者。它是開放源代碼和免費的(Apache V2.0許可證)。