Как я могу преобразовать список объектов к csv?

Если у меня есть список объектов под названием "Автомобиль":

public class Car
{
     public string Name;
     public int Year;
     public string Model;
}

Как я преобразовываю список объектов, например, Список <Автомобиль> к csv?

18
задан Ralph Willgoss 7 August 2012 в 08:19
поделиться

5 ответов

  1. FileHelpers Библиотека
  2. Text OleDb Provider
  3. Руководство через конкатенацию строк в соответствии с RFC-4180
  4. Сторонняя библиотека, например Aspose.Cells может это сделать без каких-либо трений с вашей стороны. И это очень быстро.
14
ответ дан 30 November 2019 в 07:33
поделиться

Объединение значений, разделенных запятыми, я всегда хотел указать на сильно недооцененный string.Join (разделитель строк, элементы string []) статический метод, но если есть вспомогательные библиотеки, это, вероятно, лучше.

0
ответ дан 30 November 2019 в 07:33
поделиться

Посмотрите на библиотеку FileHelpers.

С сайта:

FileHelpers - это бесплатная и простая в использовании библиотека .NET для импорта/экспорта данных из записей фиксированной длины или разграниченных записей в файлах, строках или потоках.

Это гарантирует, что всевозможные проблемы с окончанием строк, экранированием и т.п. будут обработаны правильно, согласно RFC-4180.

8
ответ дан 30 November 2019 в 07:33
поделиться

добавьте следующий метод в Car:

String Escape(String s)
{
    StringBuilder sb = new StringBuilder();
    bool needQuotes = false;
    foreach (char c in s.ToArray())
    {
        switch (c)
        {
            case '"': sb.Append("\\\""); needQuotes = true; break;
            case ' ': sb.Append(" "); needQuotes = true; break;
            case ',': sb.Append(","); needQuotes = true; break;
            case '\t': sb.Append("\\t"); needQuotes = true; break;
            case '\n': sb.Append("\\n"); needQuotes = true; break;
            default: sb.Append(c); break;
        }
    }
    if (needQuotes)
        return "\"" + sb.ToString() + "\"";
    else
        return sb.ToString();
}

public void SerializeAsCsv(Stream stream)
{
    stream.Write(Escape(Name));
    stream.Write(",");
    stream.Write(Year.ToString());
    stream.Write(",");
    stream.Write(Escape(Model));
    stream.Write("\n");
}

Теперь вы можете сериализовать весь список:

foreach (Car car in list)
{
    car.SerializeAsCsv(stream);
}
9
ответ дан 30 November 2019 в 07:33
поделиться

После ввода KEY INDEX необходимо указать имя индекса, а не столбец. Чтобы найти имя индекса в идентификаторе столбца, введите sp _ help StartName , и в этой таблице появится список индексов. Pk будет назван примерно как PK_xxxxx. Используйте это имя индекса вместо «ID».

-121--1613493-

Вместо указания имени столбца укажите имя индекса. Вы можете найти имя индекса первичного ключа, как:

select name from sysindexes where object_id('DomainName') = id

Затем вы можете создать полнотекстовый индекс, как:

CREATE FULLTEXT INDEX ON DomainName
(
    MiddlePart 
    Language 0X0
)
KEY INDEX PK__DomainName__40E497F3 ON domaincatalog
WITH CHANGE_TRACKING AUTO
-121--1613494-

Я бы реализовал некоторые дополнительные сериализации поведения согласно этой статье . Если требуется получить новый вид, можно создать настройку в свойствах проектов. Этот настраивать определяет, используется ли классом сериализация csv или по умолчанию. Затем вы получите доступ к нему с помощью методов, показанных здесь . Попробуйте использовать статический конструктор для чтения приложений и сделать логическое значение доступным для кода сериализации. Код Влада выглядит отлично, просто подключите его к коду. Также можно рассмотреть другие, возможно, более желательные способы изменить поведение сериализации.

Или создайте интерфейс с именем «SerialityAsCSV» и используйте его следующим образом:

//Частичное содержимое MyCoolClass.csv:

   public class MyCoolClass : ISerializeAsCSV, IDisposable
   {

      protected static bool serializesToCSV = false;


      static MyCoolClass()
      {
         serializesToCSV = 
            (typeof(MyCoolClass).GetInterface("GrooveySoft.Shared.Interfaces.ISerializeAsCSV") == null)
            ? false
            : true;

      }


      public MyCoolClass(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
      {
        // your stuff here
      }

      public void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
      {
         // your stuff here
      }

    }

//Содержимое ISerializeAsCSV.cs

using System.Runtime.Serialization;

namespace GrooveySoft.Shared.Interfaces
{
   /// <summary>
   /// indicates that implementor will serialize to csv format
   /// </summary>
   public interface ISerializeAsCSV : ISerializable
   {
   }
}

. Я не собирал и не тестировал это. но у вас есть общая идея.

0
ответ дан 30 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: