C#에서 DataTable로 CSV 파일 읽기
-
C#
의 DataTable로 CSV 파일을 읽기 위한 라이브러리 -
Andrew Rissing의 GenericParser를 사용하여 CSV 파일을 읽고
C#
의 DataTable에 표시 -
Sebastien Lorion의 CSV 리더를 사용하여 CSV 파일을 읽고
C#
의 DataTable에 표시 -
텍스트 필드 구문 분석기를 사용하여 CSV 파일을 읽고
C#
의 DataTable에 표시
이 문서에서는 CSV 파일을 구문 분석하고 해당 콘텐츠를 C# 창의 DataTable에 표시하는 데 사용할 수 있는 다양한 C# 라이브러리를 살펴봅니다.
C#
의 DataTable로 CSV 파일을 읽기 위한 라이브러리
프로그래밍을 하다 보면 데이터 형식을 다른 형식으로 변환해야 하는 경우가 종종 있습니다. CSV 형식은 일부 반구조화된 데이터를 파일로 저장하는 형식 중 하나입니다.
CSV 파일은 데이터가 여러 열과 필드에 저장되고 열 구분 기호(,
)를 사용하여 구분되는 쉼표로 구분된 파일입니다.
이러한 유형의 파일을 구문 분석하는 데 다양한 C# 라이브러리를 사용할 수 있습니다. 이 기사에서는 다음과 같은 가장 인기 있고 일반적으로 사용되는 세 가지 라이브러리에 대해 설명합니다.
- Andrew Rissing의 일반 파서
- Sebastien Lorion의 CSV 리더
- 텍스트 필드 파서
이러한 라이브러리는 C# 언어로 개발되었으며 CSV 파일에서 데이터를 가져와 화면에 표시하는 간단한 방법을 제공합니다.
Andrew Rissing의 GenericParser를 사용하여 CSV 파일을 읽고 C#
의 DataTable에 표시
GenericParser는 외부 요구 사항이 거의 없이 구분 및 고정 너비 데이터를 효율적으로 구문 분석하는 가볍고 휴대 가능한 솔루션입니다. Microsoft에서 제공하는 모든 솔루션은 고유한 기능도 제공하는 GenericParser로 대체할 수 있습니다.
코드는 명확한 레이아웃을 가지고 있으며 이해하고 수정하기 쉽습니다. 이 파서는 메모리와 시간 측면에서 다른 두 파서에 비해 가장 효율적입니다.
GenericParser 설치 및 사용
GenericParser에 필요한 라이브러리 파일을 설치하려면 먼저 Visual Studio에서 Windows Form 응용 프로그램을 만들고 아래 스크린샷과 같이 도구->솔루션용 Nuget 패키지 관리로 이동합니다.
프로젝트에 사용할 수 있는 다양한 패키지를 보여주는 창이 나타납니다.
찾아보기 탭으로 이동하여 Generic Parser를 검색하고 창의 오른쪽 창에서 프로젝트를 선택한 후 설치를 선택합니다. 이는 아래 스크린샷에 설명되어 있습니다.
그러면 프로젝트에 필요한 모든 라이브러리 파일이 설치됩니다. 설치가 완료되면 코드에서 라이브러리를 사용할 수 있습니다.
코드의 경우 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 파일 읽기를 위한 다양한 기능을 제공하는 여러 클래스가 있습니다. CsvReader
및 CachedCsvReader
가 그 중 하나입니다.
CsvReader
는 한 줄씩 읽어서 화면에 표시해야 할 때 사용합니다. CachedCsvReader
는 DataGrid
와 같이 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 파일을 읽고 C#
의 DataTable에 표시
TextFieldParser
클래스는 이전에 Visual Basic의 구성 요소였던 VisualBasic.FileIO
Microsoft 네임스페이스에서 이식되었습니다.
이 파서는 .NET Core 3.0 이상 버전과만 호환됩니다. .NET Core 버전 2.2 및 이전 버전은 지원하지 않습니다.
TextFieldParser
는 구조화된 텍스트 파일을 구문 분석하기 위한 메서드와 속성을 제공합니다. 또한 구분 파일(CSV)과 고정 너비의 두 가지 유형의 파일을 지원합니다.
유일한 단점은 이전 두 파서만큼 빠르고 효율적이지 않다는 것입니다. 또한 일부 보기와 데이터를 바인딩하거나 테이블 형식으로 데이터를 가져오는 등 이 문서에서 설명한 다른 파서와 같은 많은 기능을 제공하지 않습니다.
명시적으로 행별로 데이터를 읽고 직접 테이블을 채워야 합니다. 이로 인해 프로세스가 길어지고 더 많은 코딩 단계가 필요합니다.
텍스트 필드 파서를 구현하려면 Nuget 패키지를 설치해야 합니다. NuGet 패키지 창을 탐색하고 Text Field Parser를 검색합니다.
필요한 라이브러리 파일을 설치한 후 코드 파일로 이동하여 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+에 기본적으로 이미 포함되어 있으므로 타사 소프트웨어를 사용할 필요가 없습니다.