상세 컨텐츠

본문 제목

CSV파일 읽어 처리하는 방법

C#

by 탑~! 2013. 1. 17. 13:27

본문

CSV파일을 읽어 처리하는 경우에는 ,(콤마)가 필드마다 포함되어 있거나 필드가 "로 둘러쌓여 있는가 있어 번거로운 작업이 되는 경우가 있습니다.

참고로 CSV파일 사양에 대한 스펙은 RFC4180을 기준으로 이야기합니다.

 

관련 URL: http://www.ietf.org/rfc/rfc4180.txt

 

그래서 .NET Framework 2.0에서 혹시 좀더 편리하게 처리해줄 수 있는 메소드가 있는지 찾아보니 있더군요. Microsoft.VisualBasic.FileIO네임스페이스의 TextFieldParser클래스로 이 클래스를 사용하여 CSV파일을 읽어 각 필드의 문자열 얻어 낼 수 있습니다. 물론 C#에서 사용가능 합니다. ^^

우선 이 클래스를 사용하기 위해 CSV파일을 처리하는 상위 트랙터를 지정하여 인스턴스를 생성하고 CSV파일에 한국어가 포함되어 있는 경우를 대비하여 아래 소스코드처럼 코드를 지정합니다.

 

TextFieldParser ps = new TextFieldParser("sample.cvs", System.Text.Encoding.GetEncoding("EUC_KR"));

 

다음 TextFieldType속성에 FieldType.Delimited를 설정합니다. 또한, SetDelimiters메소드를 호출하여 단락문자를 설정해줍니다. 여기서는 CSV이기 때문에 콤마를 지정합니다.

 

ps.TextFieldType = FieldType.Delimited;

ps.SetDelimiters(",");

 

그리고 ReadFields메소드를 호출할 때마다, CSV파일을 한행씩 읽고 읽은행의 전체 필드를 문자열 배열로 리턴해줍니다.

 

while (!ps.EndOfData)

{

    string[] row = ps.ReadFields();

    // 배열Row 요소는 읽은행의 각 필드값
}

 

[CSVConv.cs]

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.VisualBasic.FileIO;

namespace CSVConv
{
    class Program
    {
        static void Main(string[] args)
        {
            TextFieldParser ps = new TextFieldParser("sample.csv", System.Text.Encoding.GetEncoding("EUC-KR"));

            using (ps)
            {
                ps.TextFieldType = FieldType.Delimited;
                ps.SetDelimiters(",");

                while (!ps.EndOfData)
                {
                    string[] row = ps.ReadFields();
                    foreach (string fd in row)
                    {
                        string f = fd;
                        f = f.Replace("\r\n", "n");
                        f = f.Replace(" ", "_");
                        Console.WriteLine(f + "\t");
                    }
                    Console.WriteLine();
                }
            }
        }
    }
}

 

"로 둘러쌓여있는 필드나 개행문자가 있는 필드도 정확하게 처리되는 것을 확인할 수 있습니다.

 

▨ HasFIeldsEnclosedInQuotes 속성

모든 필드가 콤마로 구분되어 있는 것을 처리하고 싶은 경우 이 속성값을 false로 설정합니다.

 

▨ TimeWhiteSpace 속성

필드 앞뒤로 공백문자를 게거 하고 싶지 않는 경우 이 속성을 false로 설정합니다. 단, "로 둘러쌓인 필드는 "로 쌓여진 내부의 공백은 제거되지 않습니다.

'C#' 카테고리의 다른 글

DirectX 를 사용하여 ScreenCapture 하기  (0) 2013.01.17
.Net Zip Library  (0) 2013.01.17
Log4Net  (0) 2013.01.03
Digital display control in C#.Net using GDI+  (0) 2012.12.27
C#에서 문자열 앞에 '@' 을 붙이는 것  (0) 2012.09.13

관련글 더보기