2017-04-21 71 views
0

我有一個CSV分隔符和以下正則表達式,用逗號分割字符串。從逗號分割時逃離英寸符號

String[] splitData = splitCSV.split(",(?=(?:[^\"]*\"[^\"]*\"^\")*[^\"]*$)"); 

它的工作原理至今絃樂像123, "foo", "bar", "no, split, here"但是當它遇到英寸符號(「),如下面的它不能做的分裂。

"123, 1.0" xyz" 

我需要它分成1231.0" xyz

希望有人能爲此提供解決方案。謝謝。

+0

你能提供一些數據嗎? – Rahul

+0

@Sajirupee:可能因爲英寸分隔字符串。身份證使用這些'''英寸?並且Id想知道該程序是否可以編譯,並且請顯示您獲得的輸出。 – user7185318

+0

您沒有向我們展示第一個輸入字符串的預期輸出。 – revo

回答

2

這裏有幾點意見:

  1. 您應該使用現有的CSV處理庫,而不是使用正則表達式創建自己的CSV處理庫。有很多Java可用,請參閱this question作爲起點。這是一個解決的問題;沒有理由重新創造它。
  2. 您提到的情況將是無效*數據。報價應該在一個字符串中轉義,通常使用兩個引號。有一個非轉義報價使得文件無效;而且一旦出現這類錯誤,通常沒有可靠的方法來告訴文件「應該」。該怎麼辦:

    • 如果該文件在您的控制範圍內,請進行更正。在字符串中使用標準轉義格式作爲引號。
    • 如果該文件不在您的控制範圍內,則應該單獨處理錯誤,而不是將其包括在覈心處理中。對文件進行預處理以查找錯誤,或者使用CSV庫中的可用錯誤處理對具有不正確格式的行進行操作。如果錯誤僅限於您提前知道的可預見問題,您可能可以糾正它們。但是在大多數情況下,這樣的錯誤會導致你不得不拒絕這些行。

*技術上不存在CSV標準,所以任何事情都會發生。但是,這將是任何合理格式的數據錯誤。在現實世界中,這幾乎總是會發生,因爲有人沒有考慮過文件格​​式,也不是因爲他們故意以這種方式進行計劃。

+0

謝謝你的幫助。使用Apache常見的csv庫。它解決了我的問題,沒有任何麻煩。 – Sajirupee

1

這裏有什麼是CSV的不尋常的方言。

雖然爲CSV沒有正式的標準,有廣泛的兩種方法來報價:

  1. 行情並不特殊。即:7" single, 12" album是兩項:7" single12" album。在這種方言中,含有,的物品存在問題。
  2. 行情很特別。即:"you, me","me you"是兩項:you, meme, you。在這種方言中,您可以在條目周圍添加引號,以便在條目中有,。但是,它會使包含"的項目出現問題,就像您發現的那樣。

典型的回答在第二種方法的"問題,是逃生報價。所以項目7" single將在CSV中顯示爲"7\" single"。這當然意味着\成爲一個問題,但這很容易以同樣的方式解決。 AC\DC 7" single在CSV中顯示爲"AC\\DC 7\" single"

如果您可以採用這些傳統方法之一,那就這樣做。然後,您可以使用現有的CSV庫,也可以推出自己的CSV庫。儘管正則表達式可以使用這些格式,但我的觀點是,它不是編寫代碼以使用CSV的最清晰的方式:我發現更清晰的狀態機(例如switch (state)語句)很好,很清晰。

如果你不能改變你的輸入格式,你必須解決的難題是,當你遇到一個"時,它是一個元字符(圍繞一個項目的一對引號的一部分)還是真實的字符項目的一部分?

作爲格式的所有者,由您決定規則是什麼。也許"只應該被認爲是一個元字符,如果它旁邊,

"A Town Called Malice", The Jam, 7", £6.99 

所以,你必須拿出自己的規則,即工作您的域,並明確寫代碼來處理這種情況:但是,即使你讓報價,不帶引號的物品的混合物引起的問題。一種方法是將輸入預處理爲規範化的CSV,以便它再次適用於傳統的CSV分析器。