[英]Escape inch symbol while splitting from comma
我有一個帶有以下正則表達式的CSV拆分器,用於用逗號拆分字符串。
String[] splitData = splitCSV.split(",(?=(?:[^\"]*\"[^\"]*\"^\")*[^\"]*$)");
到目前為止,它對String都有效,例如123, "foo", "bar", "no, split, here"
但是遇到像以下這樣的英寸sign(“)時,它將無法進行拆分。
"123, 1.0" xyz"
我需要將其分為123
和1.0" xyz
希望有人可以為此提供解決方案。 謝謝。
這里有幾點:
您提到的方案將是無效*數據。 通常在兩個引號一起使用時,應在字符串內對引號進行轉義。 引號中有一個轉義符會使文件無效; 而且,一旦出現此類錯誤,通常就沒有可靠的方法來判斷文件“應該”是什么。 該怎么做:
*從技術上講,沒有CSV標准,所以一切順利。 但這將是任何合理格式的數據錯誤。 在現實世界中,這種情況幾乎總是會發生,因為有人沒有想到文件格式,而不是因為他們有意地計划了這種格式。
您在這里擁有的是CSV的不尋常方言。
盡管沒有CSV的正式標准,但大致有兩種報價方法:
7" single, 12" album
是兩個項目: 7" single
和12" album
。 在這種方言,包含的項目,
是有問題的。 "you, me","me you"
是兩個項目: you, me
和me, 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.