Заголовки столбцов в CSV с использованием библиотеки fileHelpers? - PullRequest
48 голосов
/ 20 октября 2010

Есть ли встроенный атрибут поля в библиотеке FileHelper, который добавит строку заголовка в окончательно сгенерированный CSV?

У меня есть Google, и я не нашел много информации об этом. В настоящее время у меня есть это:

DelimitedFileEngine _engine = new DelimitedFileEngine(T);
_engine.WriteStream
        (HttpContext.Current.Response.Output, dataSource, int.MaxValue);

Работает, но без заголовка.

Я имею в виду наличие атрибута типа FieldTitleAttribute и использование его в качестве заголовка столбца.

Итак, мой вопрос: в какой момент я проверяю атрибут и вставляю столбцы заголовков? Кто-нибудь делал что-то подобное раньше?

Я бы хотел вставить заголовки и использовать пользовательский текст, отличный от фактического имени поля, просто имея атрибут для каждого члена объекта:

[FieldTitleAttribute("Custom Title")]
private string Name

и, возможно, опция для подсчета движка вставить заголовок при его создании.

Поэтому, когда вызывается WriteStream или WriteString, строка заголовка будет вставлена ​​с пользовательскими заголовками.

Я нашел пару событий для DelimitedFileEngine, но не самый лучший способ определить, является ли текущая запись первой строкой, и как вставить строку перед этим.

Ответы [ 5 ]

42 голосов
/ 18 марта 2014

Я знаю, что это старый вопрос, но вот ответ, который работает для v2.9.9

FileHelperEngine<Person> engine = new FileHelperEngine<Person>();
engine.HeaderText = engine.GetFileHeader();
31 голосов
/ 24 ноября 2011

Вот код, который сделает это: https://gist.github.com/1391429

Чтобы использовать его, вы должны украсить свои поля [FieldOrder] (хорошая практика FileHelpers в любом случае). Использование:

[DelimitedRecord(","), IgnoreFirst(1)]
public class Person
{
    // Must specify FieldOrder too
    [FieldOrder(1), FieldTitle("Name")]
    string name;

    [FieldOrder(2), FieldTitle("Age")]
    int age;
}

...

var engine = new FileHelperEngine<Person>
{
    HeaderText = typeof(Person).GetCsvHeader()
};

...

engine.WriteFile(@"C:\people.csv", people);

Но поддержка этого действительно должна быть добавлена ​​в самом FileHelpers. Я могу придумать несколько вопросов о дизайне, на которые нужно ответить, прежде чем это можно будет реализовать:

  • Что происходит при чтении файла? Afaik FileHelpers в настоящее время все основано на порядковом положении столбца и игнорирует имена столбцов ... но если у нас теперь есть атрибуты [FieldHeader] везде, то должны ли мы также попытаться сопоставить свойства с именами столбцов в файле? Должны ли вы бросить исключение, если они не совпадают? Что произойдет, если порядковый номер не соответствует имени столбца?
  • При чтении в виде таблицы данных следует использовать A) имя поля (текущий дизайн) или B) имя столбца исходного файла или C) атрибут FieldTitle?
24 голосов
/ 28 января 2011

Не знаю, нужно ли вам это по-прежнему, но вот как работает FileHelper: чтобы включить заголовки столбцов, вам нужно определить строку с заголовками, разделенными так же, как ваш файл.Например, с '|'в качестве разделителя:

 public const string HeaderLine = @"COLUMN1|COLUMN2|COLUMN3|...";

Затем при вызове вашего движка:

DelimitedFileEngine _engine = new DelimitedFileEngine<T> { HeaderText = HeaderLine };

Если вы не хотите писать заголовки, просто не устанавливайте атрибут HeaderTextдвигатель.

5 голосов
/ 09 декабря 2013
List<MyClass> myList = new List<MyClass>();
FileHelperEngine engine = new FileHelperEngine(typeof(MyClass));
String[] fieldNames = Array.ConvertAll<FieldInfo, String>(typeof(MyClass).GetFields(), delegate(FieldInfo fo) { return fo.Name; });
engine.HeaderText = String.Join(";", fieldNames);
engine.WriteFile(MapPath("MyClass.csv"), myList);
1 голос
/ 30 июня 2011

Я обнаружил, что вы можете использовать FileHelperAsyncEngine для достижения этой цели. Предполагая, что ваши данные представляют собой список с именем «output» типа «outputData», вы можете написать код, который выглядит следующим образом:

        FileHelperAsyncEngine outEngine = new FileHelperAsyncEngine(typeof(outputData));
        outEngine.HeaderText = "Header1, Header2, Header3";
        outEngine.BeginWriteFile(outputfile);
        foreach (outputData line in output){
            outEngine.WriteNext(line);
        }
        outEngine.Close();
...