2016-12-02 1 views
4

읽고 수정하고 다시 쓰고 싶은 커다란 csv 파일이 있다고 가정합니다. 아마도 필드 구분 기호를 쉼표에서 탭으로 변경하려고합니다. 아마도 인용 부호 문자를 '에서'로 변경하려고합니다. 또는 첫 번째 열의 각 값에 더하기 기호를 추가하고 싶을 수 있습니다. 파일 크기가 커서 메모리에 한 번에로드하지 않으려 고합니다. 나는 그것이 기록에 의해 기록 읽고 싶은csv 파일 변경, 동적 매핑으로 읽기 및 쓰기

를 그래서 나는이 같은 코드 쓰기 :., 그

Types that inherit IEnumerable cannot be auto mapped. Did you accidentally call GetRecord or WriteRecord which acts on a single record instead of calling GetRecords or WriteRecords which acts on a list of records?

참고 :

var inPath = @"infile.txt"; 
var outPath = @"outfile.txt"; 

CsvConfiguration readCf = GetReadConfiguration(); 
CsvConfiguration writeCf = GetWriteConfiguration(); 

using (var streamin = new FileStream(inPath, FileMode.Open)) 
using (var streamReader = new StreamReader(streamin)) 
{ 
    using (var csvReader = new CsvReader(streamReader, readCf)) 
    using (var csvWriter = new CsvWriter(new StreamWriter(outPath), writeCf)) 
    { 
     while (csvReader.Read()) 
     { 
      var currentRecord = csvReader.GetRecord<dynamic>(); 
      UpdateRecord(currentRecord); 
      csvWriter.WriteRecord(currentRecord); 
     } 
    } 
} 

이 다음과 같은 오류와 런타임에 실패합니다 재미있는 일은 UpdateRecord에서 일어난다. 실제로 위의이 줄은 완전히 주석 처리 될 수있다. 티.

GetRecordExpandoObject을 반환하고이 개체에 WriteRecord 초크를 반환합니다.

이 방법을 만드는 가장 좋은 방법은 무엇입니까?

업데이트 그냥은 분명 그렇게 : 나는 완전히 내가 CSVHelperWriteRecord 통화 ExpandoObject의를 지원하지 않기 때문에이 오류가 받고 있어요 실현. 이 작업을 수행하는 가장 쉬운 방법은 제안을 찾고 있습니다.

+0

이 오류는 단수 대신 GetRecords (복수형)를 사용한다는 것을 알려줍니다. 나는 그것이 그것을 암시하고있는 것을 의미한다. 너 그거 해봤 니? – CodingYoshi

+0

@ 코딩 요시, 아니, 그게 내가 원하는 건 아니야. –

+0

Mar L 's answer [여기] (http://stackoverflow.com/questions/33294738/read-all-values-from-csv-into-a-list-using-csvhelper)에서 도움이되는지 확인하십시오. – CodingYoshi

답변

4

ExpandoObject을 쓰는 능력이 this commit에 추가 된 것처럼 보입니다.

이것은 최신 누젠트 릴리즈 (작성 시점 기준 2.16.3)가 아니라 다음 3.x 릴리즈에 해당합니다. 옵션이 있다면 github에서 최신 베타 버전을 구해서 사용하십시오.

WriteRecord 다음에 NextRecord을 호출해야합니다. 2.16.3에서는 CVSHelper가 그것을 호출 할 것이므로 약간의 API 변경이 필요합니다.

+0

이전 버전에서는'CsvConfigurationException : IEnumerable을 상속하는 유형을 자동으로 매핑 할 수 없습니다. 레코드 목록에서 작동하는 GetRecords 또는 WriteRecords를 호출하는 대신 실수로 GetRecord 또는 WriteRecord를 호출 했습니까?'새 버전 (3.0)은'CsvTypeConverterException : IEnumerable 타입 변환은 단일 필드에 지원되지 않습니다. 이렇게하려면 자체 ITypeConverter를 만들고 AddConverter를 호출하여 TypeConverterFactory에 등록하십시오 .' –