2011-02-05 5 views
2

LINQtoCSV는 CSV 파일을 저장하고로드하기위한 좋은 라이브러리라고 생각합니다. http://www.codeproject.com/KB/linq/LINQtoCSV.aspxLINQtoCSV (또는 다른 Libs) : CSV 파일로 내보내는 방법 (동적 클래스 수)

그러나 위의 링크에 질문을 올렸지 만 작성자가 lib를 업그레이드하지 않은 것으로 보입니다. 내 질문에 대한 답이 없습니다.

내 질문은 : LINQtoCSV (또는 다른 라이브러리)를 사용하여

, 어떻게 클래스의 필드의 동적 수를 내보낼

public class DynamicNumberFieldsClass 
{ 
    [CsvColumn(FieldIndex = 1, Name = "Full Name")] 
    public string FullName { get; set; } 

    // [CsvColumn(FieldIndex = 2, Name = "Years")] 
    // I don't know how to write the CsvColumn attribute 
    // because the number of years is dynamic. 
    // If the user sets to 10 years, I want to export the CSV files 
    // with 11 columns (FullName and 10 years: Year1, Year2,.... 
    public int[] Years { get; set; } 
} 

예상 출력 CSV 파일 :

FullName Year1 Year2 Year3... 
Peter 11 12 13 
Bryan 21 22 23 

나는 성찰을 사용해야 만한다면 괜찮습니다. 하지만 내 요구 사항을 충족시키기 위해 리플렉션과 함께 LINQtoCSV 라이브러리를 사용하는 방법은 무엇입니까?

감사합니다! 큰 배열에 대한 피터

답변

0
public int[] Years { get; set; } 

//just create another property 
[CsvColumn(FieldIndex = 2, Name = "Years")] 
public string Years_InString 
{ 
    get { return this.Years 
        .Select(year => year.ToString()) 
        .Aggregate((cur, nex) => cur + "," + nex); } 
} 

은 증가 성능을 모두 StringBuilder를 사용합니다.

+0

답장을 보내 주셔서 감사합니다. 하지만 제 질문에 대해 오해했을 수도 있습니다. 특정 필드 ("Years")가 아닌 동적 필드 수를 원합니다. –

1

나는 도서관에서 유지 관리하는 CsvHelper으로 어떻게하는지 알려줄 수 있습니다. CsvHelper는 NuGet에서 사용할 수 있습니다.

var streamWriter = //...Create your writer 
var csvWriter = new CsvWriter(streamWriter); 

// Write the header row 
csvWriter.WriteField("Name"); 
foreach(var year in myList.First().Years) 
{ 
    csvWriter.WriteField("Year" + year); 
} 
csvWriter.NextRecord(); 

// Write the rest of the rows. 
foreach(var item in myList) 
{ 
    csvWriter.WriteField(item.FullName); 
    foreach(var year in item.Years) 
    { 
     csvWriter.WriteField(year); 
    } 
    csvWriter.NextRecord(); 
} 

당신은 분명히 using 블록을 사용하고 너무 널 (null)과 모든 물건을 확인하고 싶다.

관련 문제