상세 컨텐츠

본문 제목

[java개인공부] StreamTokenizer 사용하여 CSV파일 내용 읽기

Java..Story

by HeyLee 2011. 6. 16. 11:47

본문


개인공부 용도입니다.. 나중에 기억력을 살리기위한....그래도 누군가 보고 도움이 되었으면 합니다.

 

 

- 핵심 개념 -

스페이스 , 탭문자 "," ":" ";" 등의 지정된 경계자로 나뉘어서 분리되어진 stream을 말한다.

예를 들어서 스트림이 111:222:333 이고 경계자 ':'에 의해 tokenize되었다면 111,222,333 의 각각의 항목이 한 토큰인것이다.

 

분리된 토큰값을 추출할여 가공해서 사용할때 유용하게 쓰인다.

프로그램적으로 csv파일을 읽어와 db 구축을 위해서 유용하게 사용된다.

 

아래에서는 사용하지 않았지만.보통 swich(tokens.ttype)를 사용하여

 

case StreamTokenizer.TT_WORD:

case StreamTokenizer.TT_NUMBER:

 

등으로 단어일때 숫자일때 나눠서 사용하는게 일반적이다.

왜냐하면..토큰의 필드값을 가져올때 sval과 nval을 사용하는데.. 만약 들어가있는 필드값이 맞지 않다면 null을 반환하게 된다.


import java.io.*;
import java.util.ArrayList;

 

public class test  {
 public static void main(String[] args) {
  //저장할 ArrayList 선언 및 각 요소값 선언.
  String name1,name2,name3,name4,name5;
  ArrayList<infolist> arr = new ArrayList<infolist>();
    
  //파일 에러 처리 try catch문,임의로 모든 exception으로 고침.
  try {
   //파일을 읽어오기 위한 선언, 한글 지원하기 위해 euc-kr로 encoding , text도 되고 csv 확장자 도 됨. 안에 내용만 중요할 뿐.
   InputStreamReader reader = new InputStreamReader(new FileInputStream("test.txt"), "euc-kr");

   //tokenizer 선언.
   StreamTokenizer tokens= new StreamTokenizer(reader);
   //구분자 선언. ' '에 들어간 단어를 기준으로 한 토큰의 범위를 결정하게 된다.
   tokens.quoteChar(',');

   while(tokens.nextToken()!= tokens.TT_EOF){ //파일을 전부 읽을떄까지 실행하라는 의미.


    //    System.out.println(tokens.sval+" / "+tokens.lineno());
    name1 = tokens.sval;
    tokens.nextToken();

    //    System.out.println(tokens.sval+" / "+tokens.lineno());
    name2 = tokens.sval;
    tokens.nextToken();

    //    System.out.println(tokens.sval+" / "+tokens.lineno());
    name3 = tokens.sval;
    tokens.nextToken();

    //    System.out.println(tokens.sval+" / "+tokens.lineno());
    name4 = tokens.sval;
    tokens.nextToken();

    //    System.out.println(tokens.sval+" / "+tokens.lineno());
    name5 = tokens.sval;

    //arraylist에 넣기 위한 작업.
    arr.add(new infolist(name1,name2,name3,name4,name5));

   }
  } catch (Exception e) {
   // TODO Auto-generated catch block
   System.out.println("error"+e);
  }

  //각 정보가 잘 들어갔나 확인하는 곳.
  for(infolist a : arr){
   System.out.println(a.name1+"/"+a.name2+"/"+a.name3+"/"+a.name4+"/"+a.name5);
  }
 }
}
//정보저장하기 위한 선언.
class infolist{
 String name1,name2,name3,name4,name5;
 public infolist(String a, String b, String c,String d, String e) {
  // TODO Auto-generated constructor stub
  name1=a;
  name2=b;
  name3=c;
  name4=d;
  name5=e;
 } 
}



결과화면

 

숫자파일들은 sval로 받을 경우 띄엄띄엄씩 -_- 표시가 되네요.;;

참 신기함..- _-;;;;

 

아래는 생각해볼 문제...

 

솔직히 위의 코드는 csv의 형식이 짧고 정해져있다는 가정하에 쓴것 인데...

다음과 같은 대단위의 통계 자료의 CSV파일이 된다면 어떻게 처리할것인가..?


관련글 더보기

댓글 영역