JAVA CSV 파일 입출력
Java CSV 파일 입출력
CSV 파일은 Comma Separated Values 이름 그대로 콤마(,)로 구분하는 데이터 저장 형식이다.
개인적으로 엑셀파일에 데이터가 있을 때 엑셀의 다른이름으로 저장에서 파일형식을 .csv 로 바꿔서 입출력했다.
R프로그래밍을 했을 때도 입출력했던 기억이 있다.
1. csv파일 읽기
[csv 파일 샘플]
엑셀에 적고 .csv파일로 저장한 다음에 메모장을 통해 csv파일을 열어보았을 때 화면이다.
그냥 메모장에서 샘플파일을 만들어 저장해도 무관.
* 주의할 점은 UTF-8 형식의 유니코드로 저장해야 에러가 없다. (에러나면 메모장에서 UTF-8로 저장하고하면 됨.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | package com.tistory.jeongpro; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ReadCsv { public static void main(String[] args){ //반환용 리스트 List<List<String>> ret = new ArrayList<List<String>>(); BufferedReader br = null; try{ br = Files.newBufferedReader(Paths.get("C:\\Users\\world\\Desktop\\employee1.csv")); //Charset.forName("UTF-8"); String line = ""; while((line = br.readLine()) != null){ //CSV 1행을 저장하는 리스트 List<String> tmpList = new ArrayList<String>(); String array[] = line.split(","); //배열에서 리스트 반환 tmpList = Arrays.asList(array); System.out.println(tmpList); ret.add(tmpList); } }catch(FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); }finally{ try{ if(br != null){ br.close(); } }catch(IOException e){ e.printStackTrace(); } } } } | cs |
직접 코딩하면서 UTF-8문제 때문에 employee1.csv 파일로 교체했다.
결과가 깨름칙하다. 사원번호 앞에 '?' 가 붙는다. 왜 붙는지는 아직도 모르겠다.
코드는 bufferedReader로 한 줄씩 읽고 읽은 문자열에서 콤마(,)로 스플릿을 통해 나뉜 요소를 가진 배열을 만든다.
그 배열을 리스트화시켜서 넣는 것을 줄마다 반복.
2. csv 파일 쓰기
이번에는 아까 읽기한 내용 뒤에 하나의 열(주소)을 쓰기해보겠다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | package com.tistory.jeongpro; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class WriteCsv { public static void main(String[] args){ //출력 스트림 생성 BufferedWriter bufWriter = null; try{ bufWriter = Files.newBufferedWriter(Paths.get("C:\\Users\\world\\Desktop\\employee2.csv"),Charset.forName("UTF-8")); //csv파일 읽기 List<List<String>> allData = readCSV(); for(List<String> newLine : allData){ List<String> list = newLine; for(String data : list){ bufWriter.write(data); bufWriter.write(","); } //추가하기 bufWriter.write("주소"); //개행코드추가 bufWriter.newLine(); } }catch(FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); }finally{ try{ if(bufWriter != null){ bufWriter.close(); } }catch(IOException e){ e.printStackTrace(); } } } public static List<List<String>> readCSV(){ //반환용 리스트 List<List<String>> ret = new ArrayList<List<String>>(); BufferedReader br = null; try{ br = Files.newBufferedReader(Paths.get("C:\\Users\\world\\Desktop\\employee1.csv")); //Charset.forName("UTF-8"); String line = ""; while((line = br.readLine()) != null){ //CSV 1행을 저장하는 리스트 List<String> tmpList = new ArrayList<String>(); String array[] = line.split(","); //배열에서 리스트 반환 tmpList = Arrays.asList(array); System.out.println(tmpList); ret.add(tmpList); } }catch(FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); }finally{ try{ if(br != null){ br.close(); } }catch(IOException e){ e.printStackTrace(); } } return ret; } } | cs |
코드가 길어보이지만 아래(readCSV)함수는 아까 csv파일 읽기 소스를 그대로 옮겨서 함수로 바꾼 것뿐이다.
1. 쓰기형식(bufferdWriter)으로 파일을 열고
2. 기존 읽기코드로 읽은 내용을 한줄 한줄마다 값 넣고 콤마(,) 넣고 값 넣고 콤마(,)넣고를 반복한다.
3. 한 줄을 다 적었을 때 추가할 값을 넣는다.
4. 잘 생성되었는지 확인한다.
[결과]