C# 에서 엑셀과 상호 연동 개발을 하다보면 Excel 이 설치 되지 않은 곳에서 개발을 해야 할 경우도 있습니다. 이럴경우 CSV 로 개발하는것이 효율적일 수 있습니다.
CSV 라 하면 Comma Separated Values 라 하여 ‘,’ 로 분리 된 문자열입니다.
C#에서는 이러한 CSV 파일을 다루는 데 사용할 수 있는 여러 가지 방법이 있습니다. 이번 포스트에서는 C# CSV 파일을 읽고 쓰는 간단하고 효율적인 방법을 살펴보겠습니다.
CSV 파일 읽기
C#에서 CSV 파일을 읽는 가장 간단한 방법 중 하나는 StreamReader
을 사용하는 것입니다. 아래는 이를 구현한 예제 코드입니다.
using System;
using System.IO;
class Program
{
static void Main()
{
using (var reader = new StreamReader("data.csv"))
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var values = line.Split(',');
foreach (var value in values)
{
Console.Write(value + " | ");
}
Console.WriteLine();
}
}
}
}
엑셀 작업은 행단위로 작업을 많이 합니다. 즉 줄단위로 읽어서 작업하는 경우가 많지요.
그래서 편하게 StreamReader 로 한줄 한줄 읽어 ‘,’ 로 분리를 하는것이 제일 편한작업입니다.
위 코드에서는 StreamReader
을 사용하여 CSV 파일을 한 줄씩 읽고, 각 줄을 쉼표로 구분하여 값을 가져옵니다.
using (var reader = new StreamReader("data.csv"))
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
...
}
}
다음이 CSV 를 다루는 중요한 문장입니다. 한줄을 ‘,’ 로 분리 하는 작업입니다.
한줄을 분리해서 string[] 즉 배열로 만드는 작업입니다.
var values = line.Split(',');
다음처럼 StreamReader 가 아닌 File.ReadLine 을 이용할 수도 있습니다.
foreach (string line in File.ReadLines("data.csv"))
{
var values = line.Split(',');
foreach (var value in values)
{
Console.Write(value + " | ");
}
Console.WriteLine();
}
CSV 파일 쓰기
CSV 파일을 생성하고 데이터를 쓰는 것도 매우 간단합니다. 아래는 예제 코드입니다.
using System;
using System.IO;
class Program
{
static void Main()
{
using (var writer = new StreamWriter("output.csv"))
{
writer.WriteLine("Name, Age, City");
writer.WriteLine("John, 25, New York");
writer.WriteLine("Alice, 30, Los Angeles");
writer.WriteLine("Bob, 22, Chicago");
}
}
}
위 코드에서는 StreamWriter
를 사용하여 CSV 파일을 만들고 데이터를 씁니다.
정말 간단하죠. 파일에 ‘,’ 로 분리해서 써주기만 하면 됩니다.
만약 값이 Integer, Byte 일경우도 있습니다. string.Format 을 이용하면 너무 쉽게 작업할 수 있습니다.
writer.WriteLine(
string.Format("{0},{1},{2}", str_value, int_value, byte_value);
);
위와 같이 작업하면 아주 쉽게 작업이 가능합니다.
CsvHelper 라이브러리 활용
또 다른 방법은 CsvHelper 라이브러리를 사용하는 것입니다. 이 라이브러리는 CSV 파일을 읽고 쓰는 데 매우 유용합니다. 아래는 CsvHelper를 사용하여 CSV 파일을 읽는 예제 코드입니다.
CSV 파일을 읽는 작업중 귀찮은 작업중에 하나는 읽은 값을 Integer 등 다른 타입의 값으로 변경해야 하는 경우가 다수 입니다. 이런작업들을 아주 쉽게 해줄수가 있습니다.
먼저 Nuget 패키지 관리에서 CsvHelper 를 검색하여 설치해 줍니다.
예제 1
using System;
using System.IO;
using CsvHelper;
class Program
{
static void Main()
{
using (var reader = new StreamReader("data.csv"))
using (var csv = new CsvReader(reader))
{
while (csv.Read())
{
var name = csv.GetField<string>(0);
var age = csv.GetField<int>(1);
var city = csv.GetField<string>(2);
Console.WriteLine($"{name} | {age} | {city}");
}
}
}
}
위 예제는 간단히 Integer 를 캐스팅하는 예제입니다.
var age = csv.GetField<int>(1);
어떤가요 편하게 관리할 수 있겠지요..
예제 2
만약 CSV 파일이 다음과 같이 저장되어져 있다면 어떨까요?
#이름, 나이, 도시
Haro; 2; cheongju
Studio; 3; seoul
위와 같은 파일은 단지 ‘;’ 로 분리 되어져 있기 때문에 CSV 이라고 하기에는 맞진 않지만 파싱해 보도록 하겠습니다.
using CsvHelper;
using CsvHelper.Configuration;
using System;
using System.Globalization;
using System.IO;
class Program
{
static void Main()
{
var csvConfig = new CsvConfiguration(CultureInfo.CurrentCulture)
{
Comment = '#',
AllowComments = true,
Delimiter = ";",
};
var streamReader = File.OpenText("data.csv");
var csvReader = new CsvReader(streamReader, csvConfig);
while (csvReader.Read())
{
var name = csvReader.GetField<string>(0);
var age = csvReader.GetField<int>(1);
var city = csvReader.GetField<string>(2);
Console.WriteLine($"{name} | {age} | {city}");
}
}
}
출력문은 다음과 같습니다.
Haro | 2 | cheongju
Studio | 3 | seoul
위 구문처럼 CsvConfiguration 에서 주석문과 구분자를 정의 하면 간단하게 파싱할 수 있습니다.
CsvHelper를 사용하면 CSV 파일을 파싱하는 과정이 훨씬 간편해집니다.
결론
이렇게 C#에서는 다양한 방법으로 CSV 파일을 다룰 수 있습니다. 각각의 방법은 상황에 맞게 선택하여 사용할 수 있습니다.