Динамически создать файл CSV с FileHelpers - PullRequest
6 голосов
/ 22 января 2010

FileHelpers поддерживает функцию под названием «Записи RunTime», которая позволяет считывать CSV-файл в DataTable, когда вы не знаете макет до времени выполнения.

Можно ли использовать FileHelpers для создания файла CSV во время выполнения таким же образом?

Исходя из вводимых пользователем данных, файл CSV, который необходимо создать, будет иметь разные поля, которые могут быть известны только во время выполнения. Я могу создать необходимый тип для механизма FileHelper, как описано в разделе «Чтение», но не могу понять, в каком формате должны быть записаны мои данные.

var engine = new FileHelpers.FileHelperEngine(GenerateCsvType());

engine.WriteStream(context.Response.Output, dontKnow);

EDIT

В качестве альтернативы кто-нибудь может предложить хорошую библиотеку CSV, которая может создать файл CSV, не зная его полей до времени выполнения? Например, создайте файл CSV из таблицы данных.

Ответы [ 2 ]

6 голосов
/ 22 января 2010

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

CsvEngine.DataTableToCsv(dt, filename);

Дайте мне знать, если это поможет.

1 голос
/ 23 апреля 2015

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

Если вы используете FileHelpers RunTime Records для создания определения, вы можете заполнить то же определение с помощью отражения.

Например, если вы создаете определение

        DelimitedClassBuilder cb = new DelimitedClassBuilder("Customers", ",");
        cb.AddField("StringField", "string");

        Type t = cb.CreateRecordClass();
        FileHelperEngine engine = new FileHelperEngine(t); 

Теперь вы можете использовать тот же тип, созданный FileHelpers, для заполнения ваших значений следующим образом:

        object customClass = Activator.CreateInstance(t);
        System.Reflection.FieldInfo field = customClass.GetType().GetField("StringField", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
        if (field != null)
        {
            field.SetValue(customClass, "StringValue");
        }

А затем записать его в файл или строку:

        string line = engine.WriteString(new object[] { customClass });
...