Обработка строки CSV - PullRequest
       31

Обработка строки CSV

17 голосов
/ 07 августа 2008

Типичный способ создания строки CSV (псевдокод):

  1. Создайте объект контейнера CSV (например, StringBuilder в C #).
  2. Прокручивайте строки, которые вы хотите добавить, добавляя запятую после каждой.
  3. После цикла удалите эту последнюю лишнюю запятую.

Пример кода:

public string ReturnAsCSV(ContactList contactList)
{
    StringBuilder sb = new StringBuilder();
    foreach (Contact c in contactList)
    {
        sb.Append(c.Name + ",");
    }

    sb.Remove(sb.Length - 1, 1);
    //sb.Replace(",", "", sb.Length - 1, 1)

    return sb.ToString();
}

Мне нравится идея добавить запятую, проверив, пуст ли контейнер, но разве это не означает, что требуется больше обработки, поскольку необходимо проверять длину строки в каждом случае?

Я чувствую, что должен быть более простой / чистый / более эффективный способ удаления этой последней запятой. Есть идеи?

Ответы [ 13 ]

0 голосов
/ 27 июня 2012

Я использую CSVHelper - это отличная библиотека с открытым исходным кодом, которая позволяет создавать совместимые потоки CSV по одному элементу за раз или настраивать собственные классы для отображения:

public string ReturnAsCSV(ContactList contactList)
{
    StringBuilder sb = new StringBuilder();
    using (StringWriter stringWriter = new StringWriter(sb))
    {
        using (var csvWriter = new CsvHelper.CsvWriter(stringWriter))
        {
            csvWriter.Configuration.HasHeaderRecord = false;
            foreach (Contact c in contactList)
            {
                csvWriter.WriteField(c.Name);
            }
        }
    }
    return sb.ToString();
}

или если вы отобразите карту, то примерно так: csvWriter.WriteRecords<ContactList>(contactList);

0 голосов
/ 07 августа 2008

Как насчет обрезки?

public string ReturnAsCSV(ContactList contactList)
{
    StringBuilder sb = new StringBuilder();

    foreach (Contact c in contactList)
    {
        sb.Append(c.Name + ",");
    }

    return sb.ToString().Trim(',');
}
0 голосов
/ 07 августа 2008

Как насчет отслеживания наличия первого элемента и добавления запятой перед элемента, если он не первый.

public string ReturnAsCSV(ContactList contactList)
{
    StringBuilder sb = new StringBuilder();
    bool isFirst = true;

    foreach (Contact c in contactList) {
        if (!isFirst) { 
          // Only add comma before item if it is not the first item
          sb.Append(","); 
        } else {
          isFirst = false;
        }

        sb.Append(c.Name);
    }

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