C# CSV 파일 다루기: 간편하고 효율적인 방법

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 를 검색하여 설치해 줍니다.

C# CSV 파일 다루기: 간편하고 효율적인 방법

예제 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 파일을 다룰 수 있습니다. 각각의 방법은 상황에 맞게 선택하여 사용할 수 있습니다.

Leave a Comment