Java로 CSV 파일을 효율적으로 읽는 방법: 단계별 예제

Pilalo Jovanitho·2026년 8월 28일

CSV(Comma-Separated Values)는 단순성과 뛰어난 호환성 덕분에 데이터 교환에서 여전히 널리 사용되는 형식입니다. 하지만 Java에서 CSV 파일을 읽을 때는 성능, 편의성, 다양한 구분자 처리 등 여러 요소를 고려해야 합니다. 이 글에서는 Java용 Excel 처리 라이브러리인 Spire.XLS for Java를 중심으로 CSV 파일을 읽고 활용하는 효율적인 방법을 단계별 예제와 함께 살펴보겠습니다.

1. 라이브러리 설치 및 설정

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 파일을 직접 다운로드하여 프로젝트의 클래스패스에 추가할 수도 있습니다.

2. 기본적인 CSV 파일 읽기

가장 간단한 사용 사례는 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("파일경로", "구분자", 시작행, 시작열) 형식으로 다양한 파라미터를 지원합니다. 예를 들어, 세미콜론(;)을 구분자로 사용하거나, 특정 행과 열부터 데이터를 읽도록 지정할 수 있습니다.

3. CSV 파일을 DataTable로 읽기 (고급)

구조화된 데이터 처리가 필요하다면, 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 데이터를 메모리상의 표 형태로 관리할 수 있어, 대량 데이터를 필터링하거나 집계해야 하는 경우에 유용합니다.

4. 다양한 CSV 형식 및 문제 해결

CSV 파일은 표준화가 덜 되어 있어 실제 데이터는 다양한 형식과 문제를 포함할 수 있습니다. 이 라이브러리를 사용할 때 몇 가지 유용한 팁을 참고하세요.

  • 인코딩 문제: 한글이 깨져 보인다면, CSV 파일이 UTF-8로 저장되었는지 확인하세요.
  • 구분자 오류: 열 정렬이 잘못되었다면, loadFromFile() 메서드에 지정한 구분자가 실제 파일의 구분자와 일치하는지 확인해야 합니다.
  • 대용량 파일 처리: 매우 큰 CSV 파일을 다룰 때는 메모리 사용량을 고려하여 파일을 분할하거나 여러 시트로 나누는 방법을 고려할 수 있습니다.

5. 성능 비교와 오픈소스 대안

Java에서 CSV를 읽는 다른 방법과의 성능을 비교해 보는 것도 도움이 됩니다.

  • uniVocity-parsers: 매우 빠른 성능으로 알려진 오픈소스 CSV 파서로, 메모리 효율적이며 백만 개의 행을 1초 미만으로 처리할 수 있습니다.
  • SimpleFlatMapper / sesseltjonna-csv: 고성능 CSV 파싱 라이브러리로, JMH 벤치마크에서 우수한 성능을 보여줍니다.
  • Apache Commons CSV: 널리 사용되는 라이브러리이지만, 성능은 위의 전용 고성능 파서보다 다소 낮을 수 있습니다.

Spire.XLS for Java는 CSV를 Excel 개체로 읽어들이는 방식을 사용하여 데이터 처리와 서식 적용을 편리하게 하지만, 단순 CSV 파싱 성능만 놓고 본다면 전용 CSV 파서가 더 빠를 수 있습니다. 프로젝트의 주요 목표가 단순 CSV 읽기라면 성능을 고려해 볼 필요가 있습니다. 다만, 이 라이브러리는 상용 제품이므로 라이선스 정책을 확인해야 합니다.

결론

이 글에서는 Spire.XLS for Java를 사용하여 CSV 파일을 읽고, DataTable로 변환하는 방법을 코드 예제와 함께 살펴보았습니다. 이 라이브러리는 Excel 파일 처리에 강점을 가지고 있기 때문에, CSV 데이터를 읽어 Excel 형식으로 변환하거나 서식을 적용해야 하는 경우 특히 유용합니다. 다양한 구분자와 시작 위치를 지정할 수 있는 유연한 loadFromFile() 메서드 덕분에 여러 형태의 CSV 파일을 처리할 수 있습니다. 프로젝트의 요구사항, 특히 성능과 라이선스 측면을 고려하여 이 방식이 적합한지 판단하고, 필요에 따라 앞서 소개한 오픈소스 대안들과 비교해 보는 것을 권장합니다.

0개의 댓글