2013-07-30 4 views
1

내 프로젝트 중 하나에서 쉼표로 구분 된 파일 (CSV)을 처리해야했습니다. 다른 스택 오버플로 질문 (Java: splitting a comma-separated string but ignoring commas in quotes)에 언급 된 표현식을 사용하여 따옴표 안에 쉼표를 무시한 쉼표 (예 : "")를 무시하고 쉼표 ,을 기반으로 데이터를 분할해야했습니다. 최근까지는 아래에 언급 된 특정 시나리오에서 작동하지 않는 것으로 나타 났을 때까지 모든 것이 잘 작동했습니다.쉼표로 구분 된 쉼표를 쉼표로 무시하는 정규식

나는대로 쉼표를 분할하는 데 필요한 데이터 문자열이 있습니다 발현에 따라 나의 이해에서

20Y-62-27412,20Y6227412NK,BRACKET,101H,00D505060,H664374,06/25/2013,1,, 

String[] rowData = str.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); 

데이터 분할은 지난 저에게 크기 (10)의 배열을 반환해야합니다 후 빈 문자열을 포함하는 배열의 색인 대신, 분할 자로 취급되지 않는 마지막 두 개의 쉼표 인 크기 8의 배열을 얻게됩니다. 나는이 응용 프로그램의 여러 위치에서이 표현을 사용 했으므로이 작업에서 되돌아 가고 싶지 않습니다. 어떤 도움을 주시면 감사하겠습니다. 감사합니다

+0

사용 A [CSV 파서 (http://stackoverflow.com/questions/101100/csv -api-for-java)? – assylias

+0

문제는 대괄호가 포함 된 수학 용어를 파싱하는 것과 유사합니다. 대부분의 사람들은 RegEx가 ** 그것을 할 방법이 아니라고 말합니다. 나는 심지어 CSV가 정규 언어 인지도 모르겠다. (나의 대학 시절은 오래 전에 사라졌다. 그래서 XD에 관해서는 잘 모르겠다.) – AKDADEVIL

+0

필자는 매우 복잡한 문자 스키마를 가진 파일에 일본어 문자를 가지고있다. 어떤 파서라도 쉽게 할 수 있다고 생각하지 않습니다. 또한 RE는 데이터를 분할하여 올바르게 처리하므로 문제가 발생했습니다. 파서 (parser)를 사용하면 약간의 시간 범위를 고려해 볼 때 옵션이 아닌 수십 개의 장소에서 애플리케이션을 변경할 필요가 있습니다. –

답변

2

당신은 split(java.lang.String, int) 방법을 사용할 필요가

귀하의 코드는 다음 보일 것 같은 :

String str = "20Y-62-27412,20Y6227412NK,BRACKET,101H,00D505060,H664374,06/25/2013,1,,"; 
String[] rowData = str.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1); 
+0

고마워요 ... 형. 매력처럼 작동합니다 :-) –

+0

완벽한, 그것은 따옴표를 유지하고 C#에서 일을 그렇게 고마워요! –

관련 문제