CSV 파일에 대한 읽기와 쓰기 문제 (특히 큰따옴표와 쉼표가 있는 경우)

9723 단어 CSVcsv

하나.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

좋은 웹페이지 즐겨찾기