2 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊
您的輸入格式不是有效的 CSV 格式。根據(jù) Wikipedia Comma-separated values page,如果完全使用引號(hào),則必須引用字段中的文字引號(hào)字符。
這意味著任何現(xiàn)有的通用 CSV 解析器庫都不太可能處理同一文件中的兩種類型的行。
為了說明這個(gè)問題有多深,請(qǐng)考慮:
130,TEXT 1" 67 SERIES, TEXT 2",4,1,998,.010,9,-,7,130
這可能意味著:
一個(gè)字段包含
TEXT 1" 67 SERIES, TEXT 2"
一個(gè)包含
TEXT 1 67 SERIES, TEXT 2
, 或兩個(gè)字段
TEXT 1" 67 SERIES
和TEXT 2"
。
消除歧義的唯一方法是編寫一些自定義邏輯以對(duì)其進(jìn)行分類......基于您自己的業(yè)務(wù)規(guī)則。
我不認(rèn)為你可以用split
和正則表達(dá)式來做到這一點(diǎn)。您需要編寫一個(gè)適當(dāng)?shù)淖远x解析器。
但在這種情況下,我認(rèn)為您有權(quán)反對(duì)創(chuàng)建此 CSV 數(shù)據(jù)的任何人/任何人。他們應(yīng)該遵守規(guī)則。我很想實(shí)現(xiàn)我的系統(tǒng),通過現(xiàn)成的語法檢查器提供 CSV 文件,并自動(dòng)拒絕任何未通過驗(yàn)證的文件。
您可以自動(dòng)修復(fù)報(bào)價(jià)中的錯(cuò)誤嗎?我認(rèn)為不是……在一般情況下。如前所述,無法判斷格式錯(cuò)誤的 CSV 中的雙引號(hào)是否應(yīng)該是文字。它需要人類智能和領(lǐng)域知識(shí)來理解數(shù)據(jù)的含義。

TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
不知道如何(如果有的話)使用單個(gè)正則表達(dá)式來完成。但這是一種蠻力方法,它計(jì)算字符串中引號(hào)的數(shù)量并從那里開始。
public static void main(String[] args) {
System.out.println("---Type 1---");
for (String s : split("130,TEXT 1\" 67 SERIES ,400,4,1,998,.010,9,-,7,130")) {
System.out.println(s);
}
System.out.println("\n---Type 2---");
for (String s : split("130,\"TEXT, SAMPLE TEXT\",400,4,1,998,.010,9,-,7,130")) {
System.out.println(s);
}
}
private static List<String> split(String str) {
List<String> tokens = new ArrayList<>();
if (str.split("\"").length > 2) {
int firstQuoteIndex = str.indexOf("\"");
int secondQuoteIndex = str.indexOf("\"", firstQuoteIndex + 1);
tokens.add(str.substring(0, firstQuoteIndex - 1));
tokens.add(str.substring(firstQuoteIndex + 1, secondQuoteIndex));
tokens.addAll(Arrays.asList(str.substring(secondQuoteIndex + 2).split(",")));
} else {
tokens.addAll(Arrays.asList(str.split(",")));
}
return tokens;
}
輸出
---Type 1---
130
TEXT 1" 67 SERIES
400
4
1
998
.010
9
-
7
130
---Type 2---
130
TEXT, SAMPLE TEXT
400
4
1
998
.010
9
-
7
130
添加回答
舉報(bào)