반응형

CSV(comma-separated values)는 쉼표로 구분한 텍스트 파일로 확장자가.csv로 이다.

엑셀로 읽기도 편하고 간편하게 파일을 읽고 쓰는 방식으로 쉼표로 구분되어 있는 csv파일을 자바에서 읽는 방법을 포스팅한다.

 

CsvUtils.java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class CsvUtils {
	
	private static Log logger = LogFactory.getLog(CsvUtils.class);
	
	public static List<List<String>> readToList(String path) {
		List<List<String>> list = new ArrayList<List<String>>();
		File csv = new File(path);
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader(csv));
			Charset.forName("UTF-8");
			String line = "";
			
			while((line=br.readLine()) != null) {
				String[] token = line.split(",");
				List<String> tempList = new ArrayList<String>(Arrays.asList(token));
				list.add(tempList);
			}
			
		} catch (FileNotFoundException e) {
			logger.error(e);
		} catch (IOException e) {
			logger.error(e);
		} finally {
			try {
				if(br != null) {br.close();}
			} catch (IOException e) {
				logger.error(e);
			}
		}
		return list;
	}
}

 

로거부분은 제외하고 봐도 무관하다.

 

파라미터로 넘어온 경로를 읽어서 csv파일을 읽고 리스트로 return처리를 하는 함수다.

 

사용 호출부분

main.java

import java.util.List;

public class Main {

	public static void main(String[] args) {
    
		String path = "csv파일이 있는 경로 지정";
		List<List<String>> list = CsvUtils.readToList(path);
		for(int i=0; i<list.size(); i++) {
			List<String> line = list.get(i);
			for(int j=0; j<line.size(); j++) {
				System.out.print(line.get(j)+",");
			}
			System.out.println();
		}
	}
}

 

csv데이터

csv 데이터

 

결과

 

한글 처리시 유의점은 UTF-8로 csv파일이 인코딩이 된 문서여야 읽힌다는 점이다.

엑셀에서 csv로 저장시에도 기본 인코딩인 유니코드로만 저장되는 점을 발견하였고, 강제 인코딩 방법으론

csv파일을 엑셀로 열지 말고 메모장으로 열어주고 다른 이름으로 저장 클릭 후 인코딩을 UTF-8로 처리하면 정상적으로 한글이 읽힌다.

 

 

반응형