LINQtoCSV (или другие библиотеки): как экспортировать (в файл CSV) динамическое количество полей в классе - PullRequest
2 голосов
/ 05 февраля 2011

Я думаю, что LINQtoCSV - хорошая библиотека для сохранения и загрузки CSV-файлов. http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

Однако у меня есть вопрос, и я разместил его по ссылке выше, но похоже, что автор не обновляет библиотеку, и нет ответа на мой вопрос.

Мой вопрос:

Использование 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 с отражением для удовлетворения моих требований?

Спасибо!

Peter

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

Я могу рассказать вам, как это сделать с 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 и проверять наличие нулей и всего такого.

0 голосов
/ 05 февраля 2011
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 для увеличения производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...