procmail › AwsGlacier › HelpForBeginners › ProcessManager › PairingSamsungBluetoothKeyboardTrio500OnXubuntu › csv-decoding
csv decoding util
참조 : csv-encoding
- com.gimslab.util.csv.CSVReader.java
/* * 파일명 : CSVReader.java * 설명 : csv 포맷의 파일 스트림을 읽어서 배열로 리턴 * 작성자 : gimslab.com * 사용예제 - 여러 레코드 : FileReader fr = new FileReader("c:/docs/Book1.csv"); CSVReader cr = new CSVReader(fr); String[] rec = null; while((rec = cr.readRecord())!=null){ for(int i=0; i<rec.length; i++) System.out.print(i+"="+rec[i]+":"); System.out.println("<EOR>"); } * 사용예제 - 한 레코드 : new CSVReader(new StringReader("a,b,ccc")).readRecord(); * 최초작성 : 20070510 - readRecord(), getAndEmptyToken(), removeCaragetReturn() * 마지막 토큰 인식불가 오류 수정 : 20110330 */ package com.gimslab.util.csv; import java.io.*; import java.util.*; public class CSVReader { private java.io.Reader reader; public CSVReader(Reader reader) { this.reader = reader; } public String[] readRecord() throws IOException, InvalidCSVFormatException { char c; char EOF = (char)-1; // 한 컬럼 데이터를 누적할 임시 변수 StringBuffer token = new StringBuffer(); // 현재 컬럼 인덱스 int colIdx = 0; // 현재 따옴표속에 있는지를 나타내는 플래그 boolean inq = false; // record 데이터를 담을 임시 벡터 Vector<String> vec = new Vector<String>(); while((c = (char)this.reader.read())!=EOF){ // 줄바꿈을 만남 if(c==CSVUtil.RD){ debug("EOL"); if(!inq){ removeCarageReturn(token); String str = getAndEmptyToken(token); vec.add(colIdx++, str); break; } } // 코마를 만남 else if(c==CSVUtil.CD){ debug("COMMA"); if(!inq){ String str = getAndEmptyToken(token); vec.add(colIdx++, str); continue; } } // 따옴표를 만남 else if(c==CSVUtil.QT){ debug("QT"); if(inq) inq = false; else{ inq = true; } } token.append(c); } // 마지막 토큰 추가 if(token.length()>0) vec.add(colIdx++, getAndEmptyToken(token)); // end of file if(vec.size()<1 && c==EOF) return null; String[] arr = new String[vec.size()]; vec.toArray(arr); return arr; } private void debug(String string) { // System.err.println(string); } // token buffer에서 최종 컬럼값을 추출하고 버퍼를 클리어 private String getAndEmptyToken(StringBuffer token) throws InvalidCSVFormatException { int l = token.length(); if(l>0){ char s = token.charAt(0); char e = token.charAt(l-1); if(l==1 && s==CSVUtil.QT) throw new InvalidCSVFormatException(); if(s==CSVUtil.QT && e!=CSVUtil.QT || s!=CSVUtil.QT && e==CSVUtil.QT){ throw new InvalidCSVFormatException(); } else if(s==CSVUtil.QT && e==CSVUtil.QT){ if(l<2) throw new InvalidCSVFormatException(); token.deleteCharAt(0); token.deleteCharAt(token.length()-1); } } String str = token.toString(); token.delete(0, token.length()); return str.replaceAll( CSVUtil.QUOTE+CSVUtil.QUOTE, CSVUtil.QUOTE); } // ms file의 \r 제거 private void removeCarageReturn(StringBuffer token) { int l = token.length(); if(l<1) return; char c = token.charAt(l-1); if(c==CSVUtil.CR) token.deleteCharAt(l-1); } public void close() throws IOException { this.reader.close(); } public static void main(String[] args) throws Exception { System.out.println("test 1 ----------------"); String s1 = "book, 책"; String[] tks1 = new CSVReader(new StringReader(s1)).readRecord(); System.out.println(Arrays.asList(tks1)); System.out.println("test 2 ----------------"); String s2 = "book, 책\ndesk,책상"; CSVReader cvsr2 = new CSVReader(new StringReader(s2)); String[] tks2 = null; while((tks2=cvsr2.readRecord())!=null){ System.out.println(Arrays.asList(tks2)); } System.out.println("test 3 ----------------"); String s3 = "book, 책\ndesk,책상\n"; CSVReader cvsr3 = new CSVReader(new StringReader(s3)); String[] tks3 = null; while((tks3=cvsr3.readRecord())!=null){ System.out.println(Arrays.asList(tks3)); } System.out.println("test 4 ----------------"); String s4 = "book, 책\ndesk,책상\naaa"; CSVReader cvsr4 = new CSVReader(new StringReader(s4)); String[] tks4 = null; while((tks4=cvsr4.readRecord())!=null){ System.out.println(Arrays.asList(tks4)); } } }
- com.gimslab.util.csv.InvalidCSVFormatException
/* * 파일명 : InvalidCSVFormatException.java * 설명 : 올바르지 않은 CSV포맷을 파싱할때 발생 * 작성자 : gimslab.com * 최초작성 : 20070510 */ package com.gimslab.util.csv; public class InvalidCSVFormatException extends Exception { private static final long serialVersionUID = 158L; }