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;
}

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2012-12-14 00:29:57
Processing time 0.0061 sec