簡體   English   中英

從逗號分割時轉義英寸符號

[英]Escape inch symbol while splitting from comma

我有一個帶有以下正則表達式的CSV拆分器,用於用逗號拆分字符串。

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

到目前為止,它對String都有效,例如123, "foo", "bar", "no, split, here"但是遇到像以下這樣的英寸sign(“)時,它將無法進行拆分。

"123, 1.0" xyz"

我需要將其分為1231.0" xyz

希望有人可以為此提供解決方案。 謝謝。

這里有幾點:

  1. 您應該使用現有的CSV處理庫,而不是使用正則表達式創建自己的庫。 Java有很多可用的方法,請將此問題作為起點。 這是一個已解決的問題; 沒有理由重新發明它。
  2. 您提到的方案將是無效*數據。 通常在兩個引號一起使用時,應在字符串內對引號進行轉義。 引號中有一個轉義符會使文件無效; 而且,一旦出現此類錯誤,通常就沒有可靠的方法來判斷文件“應該”是什么。 該怎么做:

    • 如果文件在您的控制范圍內,請對其進行更正。 對字符串中的引號使用標准的轉義格式。
    • 如果該文件不在您的控制范圍內,則應單獨處理錯誤,而不要在核心處理中包括此錯誤。 要么對文件進行預處理以查找錯誤,要么使用CSV庫中提供的錯誤處理對格式錯誤的行進行處理。 如果錯誤僅限於您事先知道的可預測的問題,則可以進行更正。 但是在大多數情況下,此類錯誤會導致您不得不拒絕行。

*從技術上講,沒有CSV標准,所以一切順利。 但這將是任何合理格式的數據錯誤。 在現實世界中,這種情況幾乎總是會發生,因為有人沒有想到文件格式,而不是因為他們有意地計划了這種格式。

您在這里擁有的是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的代碼的最清晰方法:我發現更顯式的狀態機(例如switch (state)語句)非常清晰。

如果您無法更改輸入格式,那么您必須解決的難題是,當遇到" ,它是元字符(圍繞某項的一對引號的一部分),還是該項中包含的真實字符? ?

作為格式的所有者,您可以自行決定規則是什么。 也許"僅應在,旁邊被認為是元字符。但是,如果允許混合使用帶引號和不帶引號的項目,即使這樣也會引起問題:

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

因此,您必須提出自己的規則,該規則在您的域中適用,並編寫明確的代碼來處理這種情況。 一種方法是將輸入預處理為規范的CSV,以便再次適用於常規CSV解析器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM