我看到有几个类似的问题,但我没有发现任何令人满意的答案。我有一个逗号分隔文件,其中每一行看起来像这样:
4477,52544,,,P,S, ,,SUSAN JONES,9534 Black Bear Dr,,"CITY, NV 89506",9534 BLACK BEAR DR,,CITY,NV,89506,2008,,,, , , , ,,1
当一个令牌使用引号“CITY,NV 89506”转义逗号时,问题就出现了
我需要一个结果,其中处理了转义的令牌并且包含了每个令牌,甚至是空的令牌
非常感谢任何帮助!
答案 0 :(得分:2)
考虑使用适当的CSV解析器,例如opencsv。它将经过高度测试(与新的本土解决方案不同)并处理边缘条件,例如您描述的边缘条件(以及您没有想过的很多)。
在下载中,有一个示例文件夹,其中包含“addresses.csv”,其中包含以下行:
Jim Sample,"3 Sample Street, Sampleville, Australia. 2615",jim@sample.com
在同一目录中,文件AddressExample.java会解析此文件,并与您的问题高度相关。
答案 1 :(得分:0)
以下是使用传递的java.lang.String方法回答问题的一种方法。我相信它能满足您的需求。
private final char QUOTE = '"';
private final char COMMA = ',';
private final char SUB = 0x001A; // or whatever character you know will NEVER
// appear in the input String
public void readLine(String line) {
System.out.println("original: " + line);
// Replace commas inside quoted text with substitute character
boolean quote = false;
for (int index = 0; index < line.length(); index++) {
char ch = line.charAt(index);
if (ch == QUOTE) {
quote = !quote;
} else if (ch == COMMA && quote) {
line = replaceChar(line, index, SUB);
System.out.println("replaced: " + line);
}
}
// Strip out all quotation marks
for (int index = 0; index < line.length(); index++) {
if (line.charAt(index) == QUOTE) {
line = removeChar(line, index);
System.out.println("stripped: " + line);
}
}
// Parse input into tokens
String[] tokens = line.split(",");
// restore commas in place of SUB characters
for (int i = 0; i < tokens.length; i++) {
tokens[i] = tokens[i].replace(SUB, COMMA);
}
// Display final results
System.out.println("Final Parsed Tokens: ");
for (String token : tokens) {
System.out.println("[" + token + "]");
}
}
private String replaceChar(String input, int position, char replacement) {
String begin = input.substring(0, position);
String end = input.substring(position + 1, input.length());
return begin + replacement + end;
}
private String removeChar(String input, int position) {
String begin = input.substring(0, position);
String end = input.substring(position + 1, input.length());
return begin + end;
}
希望这有帮助