Запись только выбранных столбцов в CSV-файл с помощью CsvHelper
У меня есть небольшая программа, которая извлекает данные из веб-службы. Программа принимает ответ JSON, отображает его в POCO и записывает объекты в файл CSV (автоматическое отображение). Он отлично работает, когда я запрашиваю "все" данные в наборе данных, однако, если я запрашиваю ресурс (через OData) следующим образом: "$select EmpNo, FirstName, LastName", средство записи CSV по-прежнему будет писать все столбцы в заголовок CSV, например, "EmpNo, FirstName, LastName, Street, Address, City, Age" и т. д. и просто вставьте 0 (если int), false(если boolean) или "" (если строка) в столбцы, которые не имеют данные.
Веб-сервис корректно возвращает только указанные столбцы, поэтому проблема не в этом. Я использую CsvHelper для отображения объектов и CSV-записи. (Но я готов использовать все, что может решить мою проблему)
Я бы хотел записать только "EmpNo, FirstName, LastName" и данные столбцов в CSV-файл, если это то, что я запрашиваю в запросе OData.
Есть хорошие идеи для решения этой проблемы?
1 ответ
Трудно сказать, не зная точного кода, который вы используете. Но я предполагаю, что когда вы пишете свой список объектов, вы используете модель, в которой есть дополнительные поля, которые все пусты, потому что вы не запрашивали их через odata.
Если вы хотите только подмножество с CsvHelper, вы, вероятно, хотите указать CsvClassMap<T>
и это отобразит вашу существующую модель только в те поля, которые вы хотите
Здесь есть много примеров CsvClassMap: http://joshclose.github.io/CsvHelper/
Метод write, скорее всего, будет перегружен методом, который примет карту классов.
Вы можете создать ClassMapper и указать, какие свойства из объекта вы хотите написать (и как вы хотите их записать!)
https://joshclose.github.io/CsvHelper/examples/configuration/class-maps/mapping-properties
Затем, когда вы пойдете писать, просто укажите ClassMapper
using (var writer = new StreamWriter("path\\to\\file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.Configuration.RegisterClassMap<NameOfClassMapper>();
csv.WriteRecords(records);
}