を返す私は(CSVファイルから取られた)文字列を持っている:のJava正規表現は、Javaで予期しない結果
40;"blue-collar";"married";"secondary";"no";1100;"yes";"no";"unknown";29;"may";660
私のクラスCSV_Worker
は、指定された区切り文字(;
)で、それを分割し、必要に応じて引用符を削除します。
public class CSV_Worker {
Pattern pattern = null;
int colCount = -1;
public CSV_Worker (String delimiter, int colCount) {
// (?<=^|;)(?:"([^;]*)"|([^;]*))(?=;|$)
this.pattern = Pattern.compile("(?<=^|\\" + delimiter + ")(?:\"([^\\" + delimiter + "]*)\"|([^\\" + delimiter + "]*))(?=\\" + delimiter + "|$)");
this.colCount = colCount;
}
public String [] split (String line) {
String [] result = new String[this.colCount];
Matcher m = pattern.matcher(line);
int idx = 0;
while (m.find()) {
result[idx] = m.group();
idx++;
}
return result;
}
}
なぜCSV_Worker.split(myString)
リターン
40
"blue-collar"
"married"
...
ん
の代わりに
40
blue-collar
married
...
?
編集ソリューションは、他の正規表現だった@Fabianする
感謝:m.group()
で
(?<=^|\|)"?((?<!")[^\|]*(?!")|(?<=")[^"]*(?="))"?(?=\||$)
'String [] result = line.replaceAll("^\ "$"、 "").split( "\"? "" ");' – saka1029
は基本的には良い考えですが、引用符は互いに独立していません。文字列には先頭に/末尾の引用符付きの要素しか含まれていない可能性があります。これは結果に残る必要があります。 – Benvorth
正規表現を使用してCSVデータを解析しないでください。 CSVパーサーを使用します。それが彼らのためのものです。 – Andreas