반응형
이번 포스팅에서 csv 파일을 java로 읽어보는 예제이다.
공공데이터 포탈에서는 데이터를 다양한 데이터 포맷으로 제공해주고 있다. 그중 하나인 csv 파일은 구분자로 나누어진 데이터이다.
다방면에서 자주 쓰이고 있기 때문에 자바로 읽어보는 예제를 해볼 것이다.
먼저 메이븐으로 라이브러리를 설치해주자
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-csv -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.7</version>
</dependency>
공공데이터포탈에서 csv 파일을 가져올 경우 인코딩은 cp949 또는 euc-kr이 많았던 거 같다.
인코딩을 체크해주고 각 레코드에 접근해서 데이터를 읽어야 한글이 깨지지 않는다.
다음은 인코딩을 체크해주는 함수이다.
public String checkStringEncoding(String text) {
String result ="";
String originalStr = text;
String [] charSet = {"utf-8","euc-kr","ksc5601","iso-8859-1","x-windows-949"};
for (int i=0; i<charSet.length; i++) {
for (int j=0; j<charSet.length; j++) {
try {
System.out.println("[" + charSet[i] +"," + charSet[j] +"] = " + new String(originalStr.getBytes(charSet[i]), charSet[j]));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
return result;
}
다음은 csv 파일을 읽는 소스이다.
먼저 인코딩을 체크해주고 csv파일을 읽을 때 인코딩을 설정해줘야한다.
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.mozilla.universalchardet.UniversalDetector;
import antlr.ByteBuffer;
import antlr.CharBuffer;
public class CsvRecordReadingTest {
public static void main(String[] args) throws Exception {
String dir = "파일경로";
String fileName= "파일이름.csv";
String checkEncoding = checkCharset(dir+fileName);
//csv 포맷 설정
CSVFormat format = CSVFormat.RFC4180.withHeader().withDelimiter(',');
CSVParser parseCsv = CSVParser.parse(new File(dir+fileName), Charset.forName(checkEncoding), format);
List<CSVRecord> list = new ArrayList<CSVRecord>();
list = parseCsv.getRecords();
for(int i=0;i<list.size();i++) {
CSVRecord record = list.get(i);
int size = record.size();
for(int j=0;j<size;j++) {
System.out.println(record.get(j));
}
}
}
}
이번 포스팅에서는 csv 파일 읽는 예제를 해보았다.
라이브러리에 대한 자세한 내용은 아래 링크를 참조하면 된다.
commons.apache.org/proper/commons-csv/
반응형