CSV(쉼표로 구분된 값) 파일은 데이터 교환과 저장에 널리 사용되는 경량 형식입니다. 하지만 데이터 필터링, 정렬, UI 바인딩, 데이터베이스 저장 등 보다 복잡한 데이터 조작이 필요할 때는 DataTable이 더 적합한 경우가 많습니다. DataTable은 .NET에서 메모리 내 관계형 데이터를 표현하는 객체로, 다양한 데이터 소스와의 연동이 용이합니다.
이 글에서는 C#에서 CSV 파일을 DataTable로 변환하는 방법을 살펴보겠습니다.
CSV 데이터를 DataTable로 변환하는 것은 다음과 같은 상황에서 유용합니다:
DataTable은 Select 메서드나 DataView를 통해 조건에 맞는 데이터를 손쉽게 추출할 수 있습니다.DataGridView나 WPF의 DataGrid 컨트롤에 직접 바인딩할 수 있습니다.SqlBulkCopy 등을 사용하여 SQL Server와 같은 데이터베이스에 대량으로 데이터를 저장할 때 활용됩니다.C#에서 CSV 파일을 처리하고 DataTable로 변환하는 방법에는 여러 가지가 있습니다. Microsoft Office Interop을 사용하는 방법도 있지만, 이 방식은 Microsoft Excel이 설치되어 있어야 한다는 제약이 있습니다.
여기서는 Microsoft Office 설치 없이 작동하는 라이브러리를 사용하는 방법을 살펴보겠습니다.
NuGet 패키지 관리자를 통해 라이브러리를 설치합니다:
PM> Install-Package Spire.XLS
CSV 파일을 DataTable로 변환하는 과정은 다음과 같습니다:
Workbook 클래스의 인스턴스를 초기화합니다.LoadFromFile 메서드를 사용하여 CSV 파일을 로드합니다.Worksheet 객체를 가져옵니다.ExportDataTable 메서드를 호출하여 DataTable로 변환합니다.using Spire.Xls;
using System;
using System.Data;
namespace ConvertCsvToDataTable
{
class Program
{
static void Main(string[] args)
{
// Workbook 클래스의 인스턴스 생성
Workbook workbook = new Workbook();
// CSV 파일 로드 (쉼표를 구분자로 지정)
workbook.LoadFromFile(@"sample.csv", ",");
// 첫 번째 워크시트 가져오기
Worksheet worksheet = workbook.Worksheets[0];
// 워크시트의 데이터를 DataTable로 내보내기
DataTable dataTable = worksheet.ExportDataTable();
// DataTable 정보 출력
Console.WriteLine($"열 수: {dataTable.Columns.Count}");
Console.WriteLine($"행 수: {dataTable.Rows.Count}");
// 리소스 해제
workbook.Dispose();
}
}
}
LoadFromFile 메서드는 파일 경로와 구분자를 매개변수로 받습니다 . ExportDataTable 메서드는 워크시트의 데이터를 DataTable로 변환합니다 .
ExportDataTable 메서드는 다음과 같은 오버로드를 제공하여 변환 방식을 세부적으로 제어할 수 있습니다 :
| 오버로드 | 설명 |
|---|---|
ExportDataTable() | 워크시트의 모든 데이터를 기본 설정으로 내보냄 |
ExportDataTable(CellRange range, bool exportColumnNames, bool computedFormulaValue) | 특정 범위를 지정하고, 열 이름 포함 여부와 수식 계산 값 포함 여부를 설정 |
// 특정 범위(A1:D10)만 DataTable로 내보내기
DataTable dt = worksheet.ExportDataTable(worksheet.Range["A1:D10"], true, true);
위 예제에서 첫 번째 매개변수는 내보낼 셀 범위를, 두 번째 매개변수는 열 이름(헤더)을 포함할지 여부를, 세 번째 매개변수는 수식의 계산된 값을 포함할지 여부를 지정합니다 .
CSV 파일은 항상 쉼표로 구분되는 것은 아닙니다. 유럽 일부 지역에서는 세미콜론(;)을 사용하거나, 탭(\t)을 구분자로 사용하는 경우도 있습니다. LoadFromFile 메서드의 두 번째 매개변수를 변경하여 다양한 구분자를 처리할 수 있습니다 .
// 세미콜론을 구분자로 사용하는 CSV 파일 로드
workbook.LoadFromFile(@"sample.csv", ";");
// 탭을 구분자로 사용하는 파일 로드
workbook.LoadFromFile(@"sample.tsv", "\t");
대용량 CSV 파일을 DataTable로 변환할 때는 다음과 같은 사항을 고려해야 합니다:
메모리 사용량: DataTable은 전체 데이터를 메모리에 로드하므로, 매우 큰 파일의 경우 메모리 부족이 발생할 수 있습니다. 이 경우 청크 단위로 읽거나 스트리밍 방식을 고려해야 합니다.
처리 시간: 행과 열의 수가 많을수록 변환 시간이 증가합니다. 후속 작업까지 고려한 시간 계획이 필요합니다.
인코딩: CSV 파일은 텍스트 기반이므로 올바른 인코딩을 지정하지 않으면 한글이나 특수 문자가 깨질 수 있습니다. 대상 시스템에서 요구하는 인코딩을 확인해야 합니다.
CSV를 DataTable로 변환하는 것은 다음과 같은 상황에서 유용합니다:
DataTable로 변환하여 필터링, 검색, 정렬 기능을 제공할 수 있습니다.DataTable로 변환하여 웹 UI에 표시할 수 있습니다.DataTable로 변환한 후 데이터베이스에 일괄 저장하는 ETL 파이프라인을 구축할 수 있습니다.CSV 파일 처리를 위한 라이브러리를 선택할 때는 다음 사항을 고려해야 합니다:
Microsoft Office 의존성: 일부 라이브러리는 Microsoft Office가 설치되어 있어야 작동합니다. 서버 환경에서는 Office 설치가 어려울 수 있으므로 독립적으로 작동하는 라이브러리를 선택하는 것이 좋습니다.
CSV 구분자 지원: 쉼표, 세미콜론, 탭 등 다양한 구분자를 지원하는지 확인합니다.
DataTable 변환 기능: CSV 데이터를 직접 DataTable로 변환할 수 있는 메서드를 제공하는지 확인합니다.
라이선스: 무료 버전과 상용 버전의 기능 제한을 확인해야 합니다. 무료 버전의 경우 시트 수나 행 수에 제한이 있을 수 있습니다 .
C#에서 CSV 파일을 DataTable로 변환하는 것은 적절한 라이브러리를 사용하면 간단하게 구현할 수 있습니다. LoadFromFile 메서드로 CSV 파일을 로드한 후 ExportDataTable 메서드를 호출하면 워크시트의 데이터가 DataTable로 변환됩니다.
DataTable은 데이터 필터링, 정렬, UI 바인딩, 데이터베이스 저장 등 다양한 후속 작업에 활용할 수 있습니다. 대용량 파일을 처리할 때는 메모리 사용량과 처리 시간을 고려하고, 대상 시스템의 요구사항에 맞는 구분자와 인코딩을 지정하시기 바랍니다.