내가 (를 CSV 파일에서 가져온) 문자열을 반환자바 정규식은 예기치 않은 결과가 자바에서
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"
...
,369 않습니다
대신
40
blue-collar
married
...
?
편집 솔루션이 다른 정규 표현식했다 @Fabian하는
감사 : m.group()
와
(?<=^|\|)"?((?<!")[^\|]*(?!")|(?<=")[^"]*(?="))"?(?=\||$)
'String [] result = line.replaceAll ("^ \"$ "," ") .split ("\ "?;" "?");'시도하십시오. – saka1029
기본적으로 좋은 생각이지만 따옴표는 서로 독립적이지 않습니다. 문자열에는 선행/후행 인용 부호가있는 요소 만 포함될 수 있습니다. 이는 결과에 남아 있어야합니다. – Benvorth
정규식을 사용하여 CSV 데이터를 구문 분석하지 마십시오. CSV 파서를 사용하십시오. 그것이 그들이하는 일입니다. – Andreas