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#]CSV파일 읽어 처리하는 방법
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 |