CSV 파일 읽기

JavaBeginner
지금 연습하기

소개

이 랩에서는 Java 에서 CSV (Comma-Separated Values, 쉼표로 구분된 값) 파일을 읽는 방법을 배우겠습니다. CSV 는 스프레드시트나 데이터베이스 내보내기와 같은 표 형식 데이터를 저장하는 데 사용되는 일반적인 파일 형식입니다. CSV 파일의 각 줄은 데이터 행을 나타내며, 열은 쉼표로 구분됩니다.

Java 에서 CSV 파일을 읽는 세 가지 다른 접근 방식을 살펴보겠습니다.

  • java.io 패키지의 BufferedReader 클래스 사용
  • java.util 패키지의 Scanner 클래스 사용
  • CSV 처리를 위한 인기 있는 타사 라이브러리인 OpenCSV 라이브러리 사용

이 랩이 끝나면 특정 요구 사항에 따라 Java 애플리케이션에서 CSV 파일을 읽는 데 가장 적합한 방법을 선택할 수 있습니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 고급 레벨의 실험이며 완료율은 36%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

샘플 CSV 파일 및 프로젝트 구조 생성

CSV 파일을 읽기 전에 프로젝트가 제대로 설정되었는지 확인해 보겠습니다. 이 단계에서는 CSV 파일의 구조를 검토하고 주요 Java 클래스를 생성합니다.

CSV 파일 이해

CSV (Comma-Separated Values, 쉼표로 구분된 값) 파일은 표 형식 데이터를 일반 텍스트로 저장합니다. 각 줄은 행을 나타내고 열은 쉼표로 구분됩니다. CSV 파일은 Excel, Google Sheets, 데이터베이스 시스템과 같은 많은 애플리케이션과의 단순성과 호환성 때문에 데이터 교환에 널리 사용됩니다.

샘플 CSV 파일 검토

랩 환경에는 이미 ~/project/sample.csv에 샘플 CSV 파일이 포함되어 있습니다. 먼저 내용을 살펴보겠습니다.

cat ~/project/sample.csv

다음 출력을 볼 수 있습니다.

name,age,city
John,25,New York
Alice,30,Los Angeles
Bob,28,Chicago
Eve,22,Boston

이 CSV 파일에는 사람, 나이 및 도시에 대한 정보가 포함된 4 개의 데이터 행 (헤더 행 포함) 이 있습니다.

Java 클래스 생성

이제 이 랩 전체에서 사용할 src 디렉토리에 CSVReaderDemo.java라는 새 Java 클래스를 생성해 보겠습니다.

VSCode 에서 사이드바의 탐색기 아이콘을 클릭하고 ~/project/src 디렉토리로 이동하여 마우스 오른쪽 버튼으로 클릭하고 "새 파일"을 선택합니다. 파일 이름을 CSVReaderDemo.java로 지정합니다.

다음 기본 구조를 파일에 추가합니다.

public class CSVReaderDemo {
    public static void main(String[] args) {
        System.out.println("CSV Reader Demo");

        // We will add CSV reading code here in the next steps
    }
}
Create Java File

Java 클래스를 컴파일하고 실행하여 모든 것이 올바르게 설정되었는지 확인해 보겠습니다.

cd ~/project
javac -d . src/CSVReaderDemo.java
java CSVReaderDemo

다음 출력을 볼 수 있습니다.

CSV Reader Demo

훌륭합니다! 이제 프로젝트 구조가 준비되었습니다. 다음 단계에서는 CSV 파일을 읽는 다양한 방법을 구현합니다.

BufferedReader 를 사용하여 CSV 파일 읽기

이 단계에서는 java.io 패키지의 BufferedReader 클래스를 사용하여 CSV 파일을 읽는 첫 번째 방법을 구현합니다. 이는 Java 에서 텍스트 파일을 읽는 일반적이고 간단한 방법입니다.

BufferedReader 이해

BufferedReader는 문자 입력 스트림에서 텍스트를 읽는 클래스로, 문자를 버퍼링하여 문자, 배열 및 줄을 효율적으로 읽을 수 있도록 합니다. 버퍼 크기를 지정하거나 기본 크기를 사용할 수 있습니다.

BufferedReader 를 사용한 CSV 읽기 구현

BufferedReader를 사용하여 CSV 파일을 읽도록 CSVReaderDemo.java 파일을 업데이트해 보겠습니다. 파일의 전체 내용을 다음 코드로 바꿉니다.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class CSVReaderDemo {
    public static void main(String[] args) {
        System.out.println("Reading CSV using BufferedReader");

        // Path to our CSV file
        String csvFile = "sample.csv";

        // Lists to store our data
        List<List<String>> data = new ArrayList<>();

        // Try-with-resources to ensure the reader gets closed automatically
        try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
            String line;

            // Read each line from the file
            while ((line = br.readLine()) != null) {
                // Split the line by comma and convert to a List
                String[] values = line.split(",");
                List<String> lineData = Arrays.asList(values);

                // Add the line data to our main list
                data.add(lineData);
            }

            // Print the data we read
            System.out.println("\nData read from CSV file:");
            for (int i = 0; i < data.size(); i++) {
                List<String> row = data.get(i);
                System.out.println("Row " + i + ": " + String.join(", ", row));
            }

        } catch (IOException e) {
            System.err.println("Error reading the CSV file: " + e.getMessage());
            e.printStackTrace();
        }
    }
}
Update Java File

업데이트된 코드를 컴파일하고 실행해 보겠습니다.

cd ~/project
javac -d . src/CSVReaderDemo.java
java CSVReaderDemo

다음과 유사한 출력을 볼 수 있습니다.

Reading CSV using BufferedReader

Data read from CSV file:
Row 0: name, age, city
Row 1: John, 25, New York
Row 2: Alice, 30, Los Angeles
Row 3: Bob, 28, Chicago
Row 4: Eve, 22, Boston

코드 설명

  1. 파일 I/O 작업 및 데이터 구조에 필요한 Java 클래스를 가져옵니다.
  2. CSV 파일의 경로 (sample.csv) 를 정의합니다.
  3. CSV 데이터를 2 차원 목록으로 저장하기 위해 List<List<String>>을 생성합니다.
  4. 사용 후 BufferedReader를 자동으로 닫기 위해 try-with-resources 블록을 사용합니다.
  5. br.readLine()을 사용하여 파일에서 각 줄을 읽습니다.
  6. 각 줄에 대해 line.split(",")를 사용하여 쉼표로 분할하고 List로 변환합니다.
  7. 각 행을 주요 데이터 목록에 추가합니다.
  8. 마지막으로 데이터를 올바르게 읽었는지 확인하기 위해 데이터를 출력합니다.

BufferedReader 접근 방식은 CSV 파일을 포함한 텍스트 파일을 읽는 데 간단하고 효율적입니다. 그러나 따옴표로 묶인 쉼표나 줄 바꿈을 포함하는 필드와 같이 더 복잡한 CSV 형식을 처리할 때는 제한 사항이 있습니다.

다음 단계에서는 Scanner 클래스를 사용하는 또 다른 방법을 살펴보겠습니다.

Scanner 를 사용하여 CSV 파일 읽기

이 단계에서는 java.util 패키지의 Scanner 클래스를 사용하여 CSV 파일을 읽는 두 번째 방법을 구현합니다. Scanner 클래스는 다양한 소스에서 형식이 지정된 입력을 읽는 편리한 방법을 제공합니다.

Scanner 이해

Scanner 클래스는 구분 기호 패턴을 사용하여 입력을 토큰으로 나눕니다. 기본적으로 공백과 일치합니다. 그런 다음 결과 토큰은 다양한 next 메서드를 사용하여 다른 유형의 값으로 변환될 수 있습니다.

Scanner 를 사용한 CSV 읽기 구현

Scanner를 사용하여 CSV 파일을 읽도록 CSVReaderDemo.java 파일을 업데이트해 보겠습니다. 파일의 전체 내용을 다음 코드로 바꿉니다.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class CSVReaderDemo {
    public static void main(String[] args) {
        System.out.println("Reading CSV using Scanner");

        // Path to our CSV file
        String csvFile = "sample.csv";

        // Lists to store our data
        List<List<String>> data = new ArrayList<>();

        try (Scanner scanner = new Scanner(new File(csvFile))) {
            // Read each line from the file
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();

                // Split the line by comma and convert to a List
                String[] values = line.split(",");
                List<String> lineData = Arrays.asList(values);

                // Add the line data to our main list
                data.add(lineData);
            }

            // Print the data we read
            System.out.println("\nData read from CSV file:");
            for (int i = 0; i < data.size(); i++) {
                List<String> row = data.get(i);
                System.out.println("Row " + i + ": " + String.join(", ", row));
            }

        } catch (FileNotFoundException e) {
            System.err.println("CSV file not found: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

업데이트된 코드를 컴파일하고 실행해 보겠습니다.

cd ~/project
javac -d . src/CSVReaderDemo.java
java CSVReaderDemo

다음과 유사한 출력을 볼 수 있습니다.

Reading CSV using Scanner

Data read from CSV file:
Row 0: name, age, city
Row 1: John, 25, New York
Row 2: Alice, 30, Los Angeles
Row 3: Bob, 28, Chicago
Row 4: Eve, 22, Boston

코드 설명

  1. 파일 작업, Scanner 및 데이터 구조에 필요한 Java 클래스를 가져옵니다.
  2. CSV 파일의 경로 (sample.csv) 를 정의합니다.
  3. CSV 데이터를 2 차원 목록으로 저장하기 위해 List<List<String>>을 생성합니다.
  4. 사용 후 Scanner를 자동으로 닫기 위해 try-with-resources 블록을 사용합니다.
  5. scanner.hasNextLine()이 true 를 반환하는 동안 scanner.nextLine()을 사용하여 파일에서 각 줄을 읽습니다.
  6. 각 줄에 대해 line.split(",")를 사용하여 쉼표로 분할하고 List로 변환합니다.
  7. 각 행을 주요 데이터 목록에 추가합니다.
  8. 마지막으로 데이터를 올바르게 읽었는지 확인하기 위해 데이터를 출력합니다.

Scanner 접근 방식은 BufferedReader 접근 방식과 유사하지만 다양한 유형의 데이터를 구문 분석하기 위한 더 많은 편의 메서드를 제공합니다. 그러나 BufferedReader와 마찬가지로 복잡한 CSV 형식을 처리할 때는 제한 사항이 있습니다.

다음 단계에서는 복잡한 CSV 형식을 보다 효과적으로 처리하는 OpenCSV 라이브러리를 사용하여 보다 강력한 방법을 살펴보겠습니다.

OpenCSV 라이브러리를 사용하여 CSV 파일 읽기

이 단계에서는 OpenCSV 라이브러리를 사용하여 CSV 파일을 읽는 세 번째 방법을 구현합니다. OpenCSV 는 쉼표 또는 따옴표로 묶인 줄 바꿈이 포함된 필드와 같은 복잡한 시나리오를 처리하는 강력한 CSV 구문 분석 기능을 제공하는 타사 라이브러리입니다.

OpenCSV 이해

OpenCSV 는 모든 기본 CSV 형식 변형을 지원하는 Java 용 CSV 파서 라이브러리입니다. 이전 접근 방식과 달리 OpenCSV 는 쉼표로 간단하게 분할하면 손상될 수 있는 쉼표, 줄 바꿈 및 기타 특수 문자를 포함하는 따옴표로 묶인 필드를 제대로 처리합니다.

OpenCSV 설정

먼저 OpenCSV 라이브러리와 종속성을 다운로드해 보겠습니다.

cd ~/project
mkdir -p lib
curl -L -o lib/opencsv-5.7.1.jar https://repo1.maven.org/maven2/com/opencsv/opencsv/5.7.1/opencsv-5.7.1.jar
curl -L -o lib/commons-lang3-3.12.0.jar https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar
curl -L -o lib/commons-text-1.10.0.jar https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar
curl -L -o lib/commons-beanutils-1.9.4.jar https://repo1.maven.org/maven2/commons-beanutils/commons-beanutils/1.9.4/commons-beanutils-1.9.4.jar
curl -L -o lib/commons-collections-3.2.2.jar https://repo1.maven.org/maven2/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2.jar
curl -L -o lib/commons-logging-1.2.jar https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar

더 복잡한 CSV 파일 만들기

쉼표가 있는 따옴표로 묶인 필드를 포함하는 더 복잡한 CSV 파일을 만들어 보겠습니다.

echo 'name,description,price
"Laptop","High-performance laptop, with SSD",999.99
"Smartphone","Latest model, with dual camera",499.99
"Headphones","Noise-canceling, wireless",149.99' > ~/project/products.csv

OpenCSV 를 사용한 CSV 읽기 구현

이제 OpenCSV 를 사용하여 CSV 파일을 읽도록 CSVReaderDemo.java 파일을 업데이트해 보겠습니다. 파일의 전체 내용을 다음 코드로 바꿉니다.

import com.opencsv.CSVReader;
import com.opencsv.exceptions.CsvValidationException;
import java.io.FileReader;
import java.io.IOException;

public class CSVReaderDemo {
    public static void main(String[] args) {
        System.out.println("Reading CSV using OpenCSV");

        // Path to our CSV file with complex data
        String csvFile = "products.csv";

        try (CSVReader reader = new CSVReader(new FileReader(csvFile))) {
            // Read and print the header
            String[] header = reader.readNext();
            if (header != null) {
                System.out.println("\nHeader: " + String.join(", ", header));
            }

            // Read and print each line
            String[] nextLine;
            int rowNumber = 1;

            System.out.println("\nData read from CSV file:");
            while ((nextLine = reader.readNext()) != null) {
                System.out.println("Row " + rowNumber + ":");
                for (int i = 0; i < nextLine.length; i++) {
                    System.out.println("  " + header[i] + ": " + nextLine[i]);
                }
                rowNumber++;
                System.out.println();
            }

        } catch (IOException | CsvValidationException e) {
            System.err.println("Error reading the CSV file: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

업데이트된 코드를 컴파일하고 실행해 보겠습니다.

cd ~/project
javac -cp ".:lib/*" -d . src/CSVReaderDemo.java
java -cp ".:lib/*" CSVReaderDemo

다음과 유사한 출력을 볼 수 있습니다.

Reading CSV using OpenCSV

Header: name, description, price

Data read from CSV file:
Row 1:
  name: Laptop
  description: High-performance laptop, with SSD
  price: 999.99

Row 2:
  name: Smartphone
  description: Latest model, with dual camera
  price: 499.99

Row 3:
  name: Headphones
  description: Noise-canceling, wireless
  price: 149.99

코드 설명

  1. OpenCSV 라이브러리 및 Java I/O 에서 필요한 클래스를 가져옵니다.
  2. CSV 파일의 경로 (products.csv) 를 정의합니다.
  3. CSV 파일을 읽기 위해 CSVReader 객체를 생성합니다.
  4. reader.readNext()를 사용하여 헤더 행을 읽고 나중에 사용하기 위해 저장합니다.
  5. 그런 다음 더 이상 행이 없을 때까지 루프에서 reader.readNext()를 사용하여 각 후속 행을 읽습니다.
  6. 각 행에 대해 해당 헤더와 함께 각 필드를 출력합니다.

OpenCSV 라이브러리는 쉼표가 따옴표로 묶인 필드를 올바르게 구문 분석하여 복잡한 CSV 형식을 자동으로 처리합니다. 따라서 복잡한 데이터를 포함할 수 있는 실제 CSV 파일에 이상적입니다.

OpenCSV 의 장점

OpenCSV 는 기본 접근 방식에 비해 몇 가지 장점을 제공합니다.

  1. 쉼표, 줄 바꿈 및 기타 특수 문자를 포함하는 따옴표로 묶인 필드를 올바르게 처리합니다.
  2. 빈 (Java 객체) 으로 읽기 위한 내장 지원을 제공합니다.
  3. 사용자 지정 구분 기호, 따옴표 문자 및 이스케이프 문자와 같은 고급 기능을 지원합니다.
  4. 대용량 CSV 파일을 효율적으로 처리합니다.

CSV 파일을 처리하는 대부분의 실제 응용 프로그램의 경우 OpenCSV 와 같은 전용 라이브러리를 사용하는 것이 좋습니다.

요약

이 랩에서는 Java 에서 CSV 파일을 읽는 세 가지 다른 접근 방식을 살펴보았습니다.

  1. BufferedReader 사용: 표준 Java I/O 라이브러리를 사용하는 간단한 접근 방식입니다. 기본적인 CSV 파일에는 잘 작동하지만 복잡한 CSV 형식을 처리할 때는 제한 사항이 있습니다.
  2. Scanner 사용: 표준 Java 유틸리티 라이브러리를 사용하는 또 다른 접근 방식입니다. BufferedReader 와 마찬가지로 간단한 CSV 파일에 적합하지만 복잡한 CSV 형식에 대한 지원이 부족합니다.
  3. OpenCSV 사용: CSV 처리를 위해 특별히 설계된 타사 라이브러리를 사용하는 강력한 접근 방식입니다. 쉼표, 줄 바꿈 및 기타 특수 문자를 포함하는 따옴표로 묶인 필드를 포함하여 복잡한 CSV 형식을 처리합니다.

각 접근 방식에는 장점과 사용 사례가 있습니다.

  • BufferedReaderScanner는 외부 종속성을 피하고 싶을 때 간단한 CSV 파일에 적합한 선택입니다.
  • OpenCSV는 잠재적으로 복잡한 CSV 파일을 처리하는 실제 응용 프로그램에 가장 적합한 선택입니다.

이러한 다양한 접근 방식을 이해함으로써 특정 요구 사항과 CSV 데이터의 복잡성을 기반으로 가장 적합한 방법을 선택할 수 있습니다.

CSV 파일은 데이터 처리, 데이터 교환 및 데이터 통합 시나리오에서 널리 사용됩니다. CSV 파일을 읽고 처리하는 능력은 Java 개발자, 특히 데이터 중심 응용 프로그램 및 다른 시스템과의 통합에 유용한 기술입니다.