CSV(Comma-Separated Values)는 단순성과 뛰어난 호환성 덕분에 데이터 교환에서 여전히 널리 사용되는 형식입니다. 하지만 Java에서 CSV 파일을 읽을 때는 성능, 편의성, 다양한 구분자 처리 등 여러 요소를 고려해야 합니다. 이 글에서는 Java용 Excel 처리 라이브러리인 Spire.XLS for Java를 중심으로 CSV 파일을 읽고 활용하는 효율적인 방법을 단계별 예제와 함께 살펴보겠습니다.
CSV 파일을 읽고 처리하려면 먼저 프로젝트에 적절한 라이브러리를 추가해야 합니다. Spire.XLS for Java는 Maven을 통해 간단히 설치할 수 있습니다.
Maven을 사용하는 경우 pom.xml 파일에 다음 리포지토리와 의존성을 추가합니다.
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.xls</artifactId>
<version>16.7.3</version>
</dependency>
</dependencies>
Maven을 사용하지 않는다면, JAR 파일을 직접 다운로드하여 프로젝트의 클래스패스에 추가할 수도 있습니다.
가장 간단한 사용 사례는 CSV 파일을 로드하고 그 내용을 읽는 것입니다. Spire.XLS for Java는 Workbook 클래스를 통해 이 과정을 매우 간소화합니다.
주요 단계:
1. Workbook 객체를 생성합니다.
2. loadFromFile() 메서드로 CSV 파일을 로드합니다. 이때 파일 경로와 함께 구분자(delimiter), 시작 행과 열을 지정할 수 있습니다.
3. 로드된 Workbook에서 첫 번째 워크시트를 가져옵니다 (CSV는 단일 시트로 간주됩니다).
4. 시트에서 데이터가 있는 범위(getAllocatedRange())를 가져와 이중 루프로 각 셀의 데이터를 읽습니다.
예제 코드:
import com.spire.xls.*;
public class ReadCSV {
public static void main(String[] args) {
// Workbook 객체 생성
Workbook workbook = new Workbook();
// CSV 파일 로드 (구분자: 쉼표, 시작 행/열 지정 가능)
workbook.loadFromFile("data.csv", ",", 1, 1);
// 첫 번째 워크시트 가져오기
Worksheet sheet = workbook.getWorksheets().get(0);
// 데이터가 있는 셀 범위 가져오기
CellRange dataRange = sheet.getAllocatedRange();
// 행과 열을 순회하며 데이터 읽기
for (int i = 0; i < dataRange.getRowCount(); i++) {
for (int j = 0; j < dataRange.getColumnCount(); j++) {
CellRange cell = dataRange.get(i + 1, j + 1);
System.out.print(cell.getText() + "\t"); // 탭으로 구분하여 출력
}
System.out.println(); // 행 종료
}
}
}
loadFromFile() 메서드는 loadFromFile("파일경로", "구분자", 시작행, 시작열) 형식으로 다양한 파라미터를 지원합니다. 예를 들어, 세미콜론(;)을 구분자로 사용하거나, 특정 행과 열부터 데이터를 읽도록 지정할 수 있습니다.
구조화된 데이터 처리가 필요하다면, CSV 데이터를 DataTable 객체로 변환할 수 있습니다. DataTable은 데이터베이스 테이블처럼 행과 열로 구성되어 있어 데이터 질의, 필터링, 또는 다른 시스템과의 통합이 용이합니다.
예제 코드:
import com.spire.xls.*;
import com.spire.xls.data.table.DataTable;
public class CSVtoDataTable {
public static void main(String[] args) {
// Workbook 객체 생성 및 CSV 파일 로드
Workbook workbook = new Workbook();
workbook.loadFromFile("sample.csv", ",", 1, 1);
// 첫 번째 워크시트 가져오기
Worksheet sheet = workbook.getWorksheets().get(0);
// CSV 데이터를 DataTable로 내보내기
DataTable dataTable = sheet.exportDataTable();
// 행과 열 수 출력
System.out.println("Total columns: " + dataTable.getColumns().size());
System.out.println("Total rows: " + dataTable.getRows().size());
System.out.println();
// 열 이름 출력
for (int i = 0; i < dataTable.getColumns().size(); i++) {
System.out.print(dataTable.getColumns().get(i).getColumnName() + " | ");
}
System.out.println();
System.out.println("----------------------------------------------------------");
// 데이터 행 출력
for (int i = 0; i < dataTable.getRows().size(); i++) {
for (int j = 0; j < dataTable.getColumns().size(); j++) {
System.out.print(dataTable.getRows().get(i).getString(j) + "\t");
}
System.out.println();
}
}
}
이 방식은 CSV 데이터를 메모리상의 표 형태로 관리할 수 있어, 대량 데이터를 필터링하거나 집계해야 하는 경우에 유용합니다.
CSV 파일은 표준화가 덜 되어 있어 실제 데이터는 다양한 형식과 문제를 포함할 수 있습니다. 이 라이브러리를 사용할 때 몇 가지 유용한 팁을 참고하세요.
loadFromFile() 메서드에 지정한 구분자가 실제 파일의 구분자와 일치하는지 확인해야 합니다.Java에서 CSV를 읽는 다른 방법과의 성능을 비교해 보는 것도 도움이 됩니다.
Spire.XLS for Java는 CSV를 Excel 개체로 읽어들이는 방식을 사용하여 데이터 처리와 서식 적용을 편리하게 하지만, 단순 CSV 파싱 성능만 놓고 본다면 전용 CSV 파서가 더 빠를 수 있습니다. 프로젝트의 주요 목표가 단순 CSV 읽기라면 성능을 고려해 볼 필요가 있습니다. 다만, 이 라이브러리는 상용 제품이므로 라이선스 정책을 확인해야 합니다.
이 글에서는 Spire.XLS for Java를 사용하여 CSV 파일을 읽고, DataTable로 변환하는 방법을 코드 예제와 함께 살펴보았습니다. 이 라이브러리는 Excel 파일 처리에 강점을 가지고 있기 때문에, CSV 데이터를 읽어 Excel 형식으로 변환하거나 서식을 적용해야 하는 경우 특히 유용합니다. 다양한 구분자와 시작 위치를 지정할 수 있는 유연한 loadFromFile() 메서드 덕분에 여러 형태의 CSV 파일을 처리할 수 있습니다. 프로젝트의 요구사항, 특히 성능과 라이선스 측면을 고려하여 이 방식이 적합한지 판단하고, 필요에 따라 앞서 소개한 오픈소스 대안들과 비교해 보는 것을 권장합니다.