C#에서 DataTable로 CSV 파일 읽기

Naila Saad Siddiqui 2023년10월12일
  1. C#의 DataTable로 CSV 파일을 읽기 위한 라이브러리
  2. Andrew Rissing의 GenericParser를 사용하여 CSV 파일을 읽고 C#의 DataTable에 표시
  3. Sebastien Lorion의 CSV 리더를 사용하여 CSV 파일을 읽고 C#의 DataTable에 표시
  4. 텍스트 필드 구문 분석기를 사용하여 CSV 파일을 읽고 C#의 DataTable에 표시
C#에서 DataTable로 CSV 파일 읽기

이 문서에서는 CSV 파일을 구문 분석하고 해당 콘텐츠를 C# 창의 DataTable에 표시하는 데 사용할 수 있는 다양한 C# 라이브러리를 살펴봅니다.

C#의 DataTable로 CSV 파일을 읽기 위한 라이브러리

프로그래밍을 하다 보면 데이터 형식을 다른 형식으로 변환해야 하는 경우가 종종 있습니다. CSV 형식은 일부 반구조화된 데이터를 파일로 저장하는 형식 중 하나입니다.

CSV 파일은 데이터가 여러 열과 필드에 저장되고 열 구분 기호(,)를 사용하여 구분되는 쉼표로 구분된 파일입니다.

이러한 유형의 파일을 구문 분석하는 데 다양한 C# 라이브러리를 사용할 수 있습니다. 이 기사에서는 다음과 같은 가장 인기 있고 일반적으로 사용되는 세 가지 라이브러리에 대해 설명합니다.

  1. Andrew Rissing의 일반 파서
  2. Sebastien Lorion의 CSV 리더
  3. 텍스트 필드 파서

이러한 라이브러리는 C# 언어로 개발되었으며 CSV 파일에서 데이터를 가져와 화면에 표시하는 간단한 방법을 제공합니다.

Andrew Rissing의 GenericParser를 사용하여 CSV 파일을 읽고 C#의 DataTable에 표시

GenericParser는 외부 요구 사항이 거의 없이 구분 및 고정 너비 데이터를 효율적으로 구문 분석하는 가볍고 휴대 가능한 솔루션입니다. Microsoft에서 제공하는 모든 솔루션은 고유한 기능도 제공하는 GenericParser로 대체할 수 있습니다.

코드는 명확한 레이아웃을 가지고 있으며 이해하고 수정하기 쉽습니다. 이 파서는 메모리와 시간 측면에서 다른 두 파서에 비해 가장 효율적입니다.

GenericParser 설치 및 사용

GenericParser에 필요한 라이브러리 파일을 설치하려면 먼저 Visual Studio에서 Windows Form 응용 프로그램을 만들고 아래 스크린샷과 같이 도구->솔루션용 Nuget 패키지 관리로 이동합니다.

GenericParser 라이브러리 설치를 위한 1단계 - NuGet 패키지

프로젝트에 사용할 수 있는 다양한 패키지를 보여주는 창이 나타납니다.

찾아보기 탭으로 이동하여 Generic Parser를 검색하고 창의 오른쪽 창에서 프로젝트를 선택한 후 설치를 선택합니다. 이는 아래 스크린샷에 설명되어 있습니다.

GenericParser 라이브러리 설치 2단계

그러면 프로젝트에 필요한 모든 라이브러리 파일이 설치됩니다. 설치가 완료되면 코드에서 라이브러리를 사용할 수 있습니다.

코드의 경우 CSV 파일에서 채워질 데이터 테이블을 표시하기 위해 양식에 DataGridView를 만들었습니다. Form1.cs 파일을 열고 Form load 함수에 코드를 작성합니다.

첫 번째 단계는 GenericParserAdapter 객체를 생성하는 것입니다. 데이터 테이블에 데이터를 표시해야 하므로 Adapter 클래스를 사용하고 있습니다.

Adapter 클래스는 데이터 테이블의 전체 데이터를 직접 복사하는 방법을 제공합니다.

개체가 생성된 후 SetDataSource 기능을 사용하여 읽을 CSV 파일의 경로를 제공합니다. 데이터 소스가 제공되면 열 구분 기호, 첫 번째 행 헤더, 버퍼 크기, 최대 행 수 및 텍스트 한정자와 같은 데이터 파일의 다양한 속성이 설정됩니다.

초기화 후 GetDataTable 기능을 사용하여 DataTable의 데이터를 가져옵니다. 이 기능은 행 머리글을 포함하여 Data Table의 CSV 파일에서 모든 데이터를 자동으로 채웁니다.

이를 C# 코드로 캡슐화해 보겠습니다.

DataTable dataTable = new DataTable();

using GenericParserAdapter dataParser = new GenericParserAdapter();
dataParser.SetDataSource("SampleCSVFile.csv");
dataParser.ColumnDelimiter = ',';
dataParser.FirstRowHasHeader = true;
dataParser.SkipStartingDataRows = 0;
dataParser.MaxBufferSize = 4096;
dataParser.MaxRows = 1000000;
dataParser.TextQualifier = '\"';

dataTable = dataParser.GetDataTable();

데이터 테이블이 채워지면 모든 데이터가 표 형식으로 표시되도록 양식의 DataGridView와 바인딩합니다.

dataGridView1.DataSource = dataTable;

실행하면 다음과 같은 결과가 출력됩니다.

일반 파서 출력

Sebastien Lorion의 CSV 리더를 사용하여 CSV 파일을 읽고 C#의 DataTable에 표시

Sebastian Lorion의 CSV 판독기는 Lumen Works CSV 판독기로 알려져 있습니다. System.IO.StreamReader(방화 호스 커서라고도 하는 것과 동일)를 기반으로 디자인된 정방향 전용 비캐시 판독기입니다.

OLEDB 및 regex 방법과 비교할 때 약 15배 더 빠르게 수행되지만 메모리를 거의 사용하지 않습니다.

이 라이브러리를 설치하려면 Nuget Packages(이 단계의 이전 예 참조)를 찾아보고 LumenWorks CSV Reader를 검색합니다.

CSV 리더 라이브러리 설치 1단계

CSV 파일 읽기를 위한 다양한 기능을 제공하는 여러 클래스가 있습니다. CsvReaderCachedCsvReader가 그 중 하나입니다.

CsvReader는 한 줄씩 읽어서 화면에 표시해야 할 때 사용합니다. CachedCsvReaderDataGrid와 같이 CSV 데이터를 화면의 일부 데이터 뷰어에 바인딩해야 할 때 사용됩니다.

파일을 열고 화면에 표시하는 것만 큼 간단합니다.

이전 예제와 같이 샘플 CSV 파일이 있고 해당 CSV 파일을 구문 분석하고 Form 애플리케이션의 DataGridView에 표시해야 한다고 가정해 보겠습니다(이전 예제와 동일).

using (CachedCsvReader dataReader = new CachedCsvReader(new StreamReader("SampleCSVFile.csv"),
                                                        true)) {
  // The headers in the CSV file will be the columns of the DataTable
  dataGridView1.DataSource = dataReader;
}

DataGridView에 데이터를 표시해야 하므로 CachedCsvReader 클래스를 사용했습니다. 기본 디자인이 StreamReader를 기반으로 하기 때문에 객체 생성은 StreamReader의 객체를 사용합니다.

파일을 연 후 모든 파일 데이터는 dataReader 개체에 저장됩니다. 양식 화면에서 해당 개체를 DataGridView와 바인딩합니다.

DataGridView는 열 수와 열 이름에 따라 자동으로 채워집니다. 열을 직접 만들 필요가 없습니다.

두 코드 세그먼트에 동일한 파일을 사용했기 때문에 출력은 이전과 동일합니다.

CSV Reader 출력

텍스트 필드 구문 분석기를 사용하여 CSV 파일을 읽고 C#의 DataTable에 표시

TextFieldParser 클래스는 이전에 Visual Basic의 구성 요소였던 VisualBasic.FileIO Microsoft 네임스페이스에서 이식되었습니다.

이 파서는 .NET Core 3.0 이상 버전과만 호환됩니다. .NET Core 버전 2.2 및 이전 버전은 지원하지 않습니다.

TextFieldParser는 구조화된 텍스트 파일을 구문 분석하기 위한 메서드와 속성을 제공합니다. 또한 구분 파일(CSV)과 고정 너비의 두 가지 유형의 파일을 지원합니다.

유일한 단점은 이전 두 파서만큼 빠르고 효율적이지 않다는 것입니다. 또한 일부 보기와 데이터를 바인딩하거나 테이블 형식으로 데이터를 가져오는 등 이 문서에서 설명한 다른 파서와 같은 많은 기능을 제공하지 않습니다.

명시적으로 행별로 데이터를 읽고 직접 테이블을 채워야 합니다. 이로 인해 프로세스가 길어지고 더 많은 코딩 단계가 필요합니다.

텍스트 필드 파서를 구현하려면 Nuget 패키지를 설치해야 합니다. NuGet 패키지 창을 탐색하고 Text Field Parser를 검색합니다.

TextFieldParser 라이브러리 설치 1단계

필요한 라이브러리 파일을 설치한 후 코드 파일로 이동하여 CSV 파일에서 데이터를 읽는 함수를 만듭니다. 이 함수에서는 먼저 TextFieldParser 개체와 DataTable 개체를 만듭니다.

더 나아가 개체에 구분 토큰 기호를 지정하고 다른 값을 초기화합니다.

그런 다음 파일의 첫 번째 행을 읽어 Data Table의 열을 만들고 해당 열을 추가합니다. 그런 다음 나머지 데이터를 읽고 나머지 데이터를 DataTable에 행별로 추가합니다.

코딩 함수에 캡슐화해 보겠습니다.

private static DataTable ParseDataFromCSV(string path) {
  DataTable myData = new DataTable();
  try {
    using (TextFieldParser reader = new TextFieldParser(path)) {
      reader.SetDelimiters(new string[] { "," });
      reader.HasFieldsEnclosedInQuotes = true;
      string[] col_headers = reader.ReadFields();
      foreach (string h in col_headres) {
        DataColumn d1 = new DataColumn(h);
        d1.AllowDBNull = true;
        myData.Columns.Add(d1);
      }

      while (!reader.EndOfData) {
        string[] row_data = reader.ReadFields();
        myData.Rows.Add(row_data);
      }
    }
  }

다음과 같이 파일 경로를 제공하는 드라이버 함수에서 이 함수를 호출합니다.

DataTable dataTable = new DataTable();
dataTable = ParseDataFromCSV("SampleCSVFile.csv");
dataGridView1.DataSource = dataTable;

이 코드 세그먼트의 출력도 이전 코드 세그먼트와 동일합니다.

텍스트 필드 파서의 출력

C# 사용자는 간단하고 사용자 친화적인 TextFieldParser를 사용하여 CSV 파일을 읽을 수 있습니다. 구분된 파일(CSV) 및 고정 너비 파일과 같은 파일을 간단하게 구문 분석할 수 있는 기술과 속성을 제공합니다.

.NET Core 3.0+에 기본적으로 이미 포함되어 있으므로 타사 소프트웨어를 사용할 필요가 없습니다.

관련 문장 - Csharp CSV