CSV 파일에 대한 읽기와 쓰기 문제 (특히 큰따옴표와 쉼표가 있는 경우)
하나.CSV의 읽기와 쓰기는 txt 파일처럼 읽기와 쓰기가 가능합니다.
/*=================== =======================*/
InputStreamReader read = new InputStreamReader(
new FileInputStream(file),encoding);//
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt;
while((lineTxt = bufferedReader.readLine()) != null ){
if(!lineTxt.trim().equals("")) {
String[] temp = lineTxt.split("\t",-1);
txtList.add(temp);
}
}
read.close();
/*================== ========================*/
File txtFile = new File(filePath);
//
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(txtFile, true),encoding));
if(content != null && content.size()>0){
for(Integer i=0 ; iString[] element = content.get(i);//
if(element != null && element.length > 0){
for(Integer j=0; jString temp = element[j];
if(j == element.length - 1){
bw.write(temp + "
");
}else{
bw.write(temp + separator);
}
}
}
}
자바가 제공하는 라이브러리javacsv와opencsv로 쓸 수도 있지만 자바csv는 추가할 수 없습니다. 중국어 OK.opencsv는 추가할 수 있지만 중국어는 엉망입니다.둘 다 쓰기 가능 필드에 쉼표로 표시됩니다.
2.txt 파일을 쓰는 방식으로 csv를 쓸 때 내용의 쉼표와 인용부호를 특수하게 처리해야 합니다 (참고문):
CSV 전체 이름은 Comma Separated Values 또는 Character Separated Values입니다.
비록 첫 번째 표현이 더 흔하지만, 나는 두 번째 표현이 더 확실하다고 생각한다. 왜냐하면 너는 다른 문자를 구분자로 사용할 수 있기 때문이다.
쉼표로 구분된 CSV 파일을 사용하면 Excel로 직접 열 수 있습니다.만약 다른 구분자, 예를 들어'|'를 사용한다면, Excel에 이 파일은'|'를 구분자로 사용해야 Excel을 가져올 수 있다고 알려야 합니다.
며칠 전에 프로젝트 관리자가 나에게 말했다. 우리는 많은 CSV 파일이 있는데, 모두'|'를 구분자로 사용하고, Excel로 열 때 비교적 번거로우며, 사용자는 Excel에서 직접 열려고 한다.이렇게 하려면 ","를 구분자로 사용해야 합니다.그러나 파일에 쉼표가 있는 필드는 CSV 파일이 Excel에서 제대로 열려 있는지 확인하려면 이러한 쉼표를 특수하게 처리해야 합니다.그는 또 나에게 알고리즘을 하나 주었다.
필드에 쉼표(,)가 있으면 큰따옴표()를 사용하여 묶습니다.
만약 이 필드에 큰따옴표가 있다면, 큰따옴표 앞에 큰따옴표를 하나 더 추가한 다음, 이 필드를 큰따옴표로 묶어야 한다.
프로젝트 관리자의 요구를 보고 나는 정말 머리를 싸매었다.IT업계에서 십여 년을 살아왔는데 이렇게 쉼표를 처리하는 줄 몰랐다.예를 들어 다음과 같이 하십시오.
필드 처리 전
필드 처리 후
abc,d2
"abc,d2"
ab"c,d2
"ab""c,d2"
"abc
"""abc"
""
""""""
만약 필드에 두 개의 인용부호가 붙어 있다면, 예를 들면:aa','ccc. 이런 상황은 특수하게 처리할 필요가 없다. 이것은 내가 이 블로그를 쓸 때 생각난 것이다. 서둘러 Excel을 사용하여 테스트를 했다. 다행히도 특수하게 처리하지 않아도 정상적으로 열 수 있다. 그렇지 않으면 프로그램을 바꿔야 한다. 당연하다. 만약 네가 그것을 처리하면'aa','cc'Excel도 정상적으로 열 수 있다.사후 총결산은 정말 좋은 점이 있다.또한 필드의 첫 번째 문자가 공백이고 두 번째 문자가 더블 인용부호인 경우 특별히 처리할 필요가 없습니다.Project Manager는 나에게 알고리즘을 설명할 때 한 필드에 두 개의 인용부호만 있는 예를 들었지만, 그는 부주의로 두 개의 인용부호 앞에 빈칸을 붙여서 문제를 덮었다.따라서 CSV 파일을 쓸 때 쉼표와 인용부호가 있는지 먼저 판단하고 해당하는 처리를 해야 한다
boolean quoteFlag = false;//
//20161214
String value = element[i];
if(value.contains("\"")){ //
value = value.replaceAll("\"","\"\"");
value = "\"" + value + "\"";
quoteFlag = true;
}
if(value.contains(",") && !quoteFlag){ //
value = "\"" + value + "\"";
}
if(j == fileHeader.size() - 1){
bw.write(value + "
");
}else{
bw.write(value + separator);
}
. 이런 csv 파일을 읽을 때 비슷한 처리를 해야 한다. // for csv
public static String clearStartAndEndQuote(String str){
if(str != null && str.length()>=2) {
if(str.indexOf("\"")==0) str = str.substring(1,str.length()); // "
if(str.lastIndexOf("\"")==(str.length()-1)) str = str.substring(0,str.length()-1); // "
str = str.replaceAll("\"\"","\"");//
}
return str;
}
String tempValue = ClassUtil.clearStartAndEndQuote(temp[j]);
셋.텍스트 내용의 쉼표 구분 (글 참조)
여러분이 이 작업을 할 때 보통 다음과 같은 문제가 발생한다.1: 데이터를 분할하고 싶습니다. 예를 들어"123","Jack jona","Computer science"
"234","Joen Dan", "Philosophy"
//이런 데이터를 만났을 때 쉼표로 직접 분할할 수 있습니다.String[] strArr = str.trim().split(",",-1);
2: 분할 데이터는 다음과 같다. "123", "jack jona", "New York, NY"
"234", "Lee Jack", "Fort myers, FL"
//이런 데이터를 만났을 때 직접 사용할 수 있다String[] strArr = str.trim().split(",(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)",-1); //
//분할할 수 있다.이런 장점은 인용부호 바깥쪽의 쉼표만 분할하고 인용부호 안의 것은 분할하지 않는다는 것이다.//쉽게 말하면 이런 분할의 결과는 123|jack jona|뉴욕, NY 234|Lee Jack|Fort myers, FL
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Mysql】 CSV 파일을 DB로 가져오기CSV에서 다운로드한 파일을 mysql을 사용하여 DB(phpmyadmin)에 저장 이전 상당히 고민한 뒤에 무사히 성공시켰는데 메모하는 것을 잊고 다시 시간이 필요해 버렸기 때문에 비망록이라는 의미도 담아 정리한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.