2016-09-29 2 views
1

소스 필드로 큰 CSV 파일을 분할하고 내보내기 파일의 이름을 소스 필드로 지정해야합니다.헤더가있는 CSV 파일을 분할하십시오. C#

내 코드는 작동하지만 작동하지 않는 유일한 점은 원본 파일의 헤더 행을 갖기 위해 분할 파일이 필요하다는 것입니다.

도움을 주시면 감사하겠습니다. 고맙습니다. CSV 파일 코드 조각을 추가하지만, 필자 헤더 필드의 조각을 넣어,이

ID, 참조, 제목, 이니셜, 뒤따라야, 성, 파일 소스

도움이되기를 바랍니다하는 방법

var splitQuery = from line in File.ReadLines(@"C:\test\test1.csv") 
      let source = line.Split(',').Last() 
      group line by source into outputs 
      select outputs; 

foreach (var output in splitQuery) 
{ 
    File.WriteAllLines(@"C:\test\" + output.Key + ".csv", output); 
} 

임 확실하지

+0

합니까'? –

+2

CSV 파일의 작은 스 니펫 샘플을 제공해 주시면 작업 내용을 알 수 있습니다. –

+0

이 CSV 구문 분석은 오류가 발생하기 쉽습니다. CSV 형식은 표준이 아니지만 쉼표를 포함하는 값은 일반적으로 쉼표가 필드 구분 기호로 처리되지 않도록 이스케이프 처리 (큰 따옴표 사용)됩니다. 필드 처리에 대한 자세한 내용은 [RFC4180] (https://www.ietf.org/rfc/rfc4180.txt)을 참조하십시오. –

답변

1

은 간단하게 먼저 헤더 행을 읽어

:

var fileLinesIterator = File.ReadLines(...); 

string headerLine = fileLinesIterator.Take(1); 

그런 다음 모든 출력을 앞에 추가 0

var splitQuery = from line in fileLinesIterator 

// ... 


    File.WriteAllLines(@"C:\test\" + output.Key + ".csv", headerLine + "\r\n" + output); 

그러나 그렇다고해서 CSV 파일을 단순한 (줄의) 문자열로 취급하고 싶지는 않습니다. 따옴표로 묶인 여러 줄 값을 사용하면 문제가 생길 수 있습니다.

+1

레코드를 읽을 때'건너 뛰기 (1) '하는 것을 잊지 마십시오. ;) –

+0

고맙습니다. 도움을 받으려면 :-) – user3206687

2

첫 번째 줄을 헤더와 그 외 모든 것으로 처리하는 CSV 파일을 구문 분석하는 데 특수 라이브러리를 사용하는 것이 좋습니다. CSV 형식은 첫 번째 시야에서 볼 수있는 것처럼 단순하지 않습니다. 예를 들어 값은 따옴표 ("값")로 표시 될 수 있으며 따옴표는 값 내부로 이스케이프 될 수 있습니다.

개인적으로 나는 CSVHelper를 사용하는 것을 선호 - 그것은 고전 .NET 및 .NET 코어 모두에 적합 : 파일의 첫 번째 줄에있는 헤더가 test1.csv`

using (var fileRdr = new StreamReader(@"C:\test\test1.csv")) { 
    var csvRdr = new CsvReader(fileRdr, 
         new CsvConfiguration() { HasHeaderRecord = true }); 
    while(csvRdr.Read()) 
    { 
     // list of csv headers 
     var csvFields = csvRdr.FieldHeaders 

     // get individual value by field name 
     var sourceVal = csvRdr.GetField<string>("File_Source"); 

     // perform your data transformation logic here 
    } 
} 
관련 문제