SCHTASKS  명령으로 웹서버에 등록되어 있는 예약작업을 CSV 포맷의 문서로 뽑아보니 무려 250개가 훨씬 넘는 배치작업 정보가 나왔다. 그래서 이렇게 저장한 CSV 문서를 읽어들여 DB에 저장하려고 닷넷으로  split() 메소드를 이용한 파싱 프로그램을 만들어 돌려보았는데 예약작업정보를 세부적으로 기술하는 컬럼에 개행문자가 들어가 있어 제대로 데이터를 가져오지 못하는 문제가 생겼다. 어떻게 해야 할까?

 

검색해보니 역시 정답이 있었다!




보통 CSV 문서를 파싱할 때는 개행문자를 구분자로 하여 건(레코드) 수를 구분하고 이렇게 구분된 각각의 개별 건은 다시 콤마(,)를 구분자로 하여 각각의 컬럼으로 나누어지는데 만일 어떤 컬럼이 두 줄 이상의 내용을 포함하고 있다면 개행문자 때문에 제대로 파싱이 되지 않는 겁니다.

그래서 찾아보니 역시 이런 문제를 해결할 수 있는 파싱 클래스가 있네요. 바로 TextFieldParser라는 클래스입니다. 친절하게도 개행문자가 있어도 제대로 파싱하여 가져오는 것을 확인할 수 있습니다. 

다음과 같은 코드를 통해 CSV 포맷의 파일을 파싱할 수 있겠습니다. 코드를 보니 개행문자(\r\n)을 단순히 'n'으로 치환하여 처리하네요. 이 클래스를 사용하기 위해서는 참조경로에 Microsoft.VisualBasic 구성요소 DLL을 추가해야 합니다. 참고하세요.


using Microsoft.VisualBasic.FileIO;

... 

TextFieldParser ps = new TextFieldParser("localFileName.csv", Encoding.Default);
using (ps)
{
    ps.TextFieldType = FieldType.Delimited;
    ps.SetDelimiters(",");
    while (!ps.EndOfData)
    {
	i++;
	Console.WriteLine("[" + i + "]번째 행");
				
	k = 0;
	string[] row = ps.ReadFields();
	foreach (string fd in row)
	{                            
	    string f = fd;
	    f = f.Replace("\r\n", "n");

	    Console.WriteLine("[" + k + "] " + f + "\t");
	    k++;
	}

	... // 데이터처리 코드
    }
}


Posted by 라스모르
,