Используя csvhelper (nuGET) с С# MVC для импорта CSV файлов
http://csvhelper.com, доступный через NuGet, используется для чтения и записи CSV файлов.
CsvHelper позволяет вам читать ваш CSV файл непосредственно в вашем пользовательском классе.
Как показано ниже в предыдущем question
var streamReader = // Create a reader to your CSV file.
var csvReader = new CsvReader( streamReader );
List<MyCustomType> myData = csvReader.GetRecords<MyCustomType>();
CsvReader автоматически отобразит как сопоставить имена свойств на основе строки заголовка (это конфигурируемый). Он использует скомпилированные деревья выражений вместо отражения, поэтому он очень быстрый.
Он также очень расширяем и конфигурируемый.
Я в основном пытаюсь разобраться, как читать в CSV файл с заголовками (неизвестные имена) и читать записи в пользовательский объект.
Нет никакой документации по этому поводу, поэтому задавалось вопросом, знал ли кто-нибудь, как использовать CsvReader для упорядочивания значений в массив строк или как вы порекомендовали бы иметь дело с этим?
Ответы
Ответ 1
Это моя первая версия, я буду обновлять, когда я изменяю вещи и делаю их более полными, но это дает мне все данные в строковых массивах.
[HttpPost]
public ActionResult UploadFile(HttpPostedFileBase file)
{
ICsvParser csvParser = new CsvParser(new StreamReader(file.InputStream));
CsvReader csvReader = new CsvReader(csvParser);
string[] headers = {};
List<string[]> rows = new List<string[]>();
string[] row;
while (csvReader.Read())
{
// Gets Headers if they exist
if (csvReader.HasHeaderRecord && !headers.Any())
{
headers = csvReader.FieldHeaders;
}
row = new string[headers.Count()];
for (int j = 0; j < headers.Count(); j++)
{
row[j] = csvReader.GetField(j);
}
rows.Add(row);
}
ImportViewModel model = new ImportViewModel(rows);
return View(model);
}
Ответ 2
Существует CsvFieldAttribute
, который вы можете поместить в свое свойство, где вы можете либо поместить имя поля csv, либо индекс поля csv. Имя будет работать только в том случае, если в файле csv есть строка заголовка.
public class MyCustomClass
{
[CsvField( FieldIndex = 1 )]
public string Property1 { get; set; }
[CsvField( FieldIndex = 0 )]
public string Property2 { get; set; }
[CsvField( FieldIndex = 2 )]
public string Property3 { get; set; }
}
Если все, что вы хотите сделать, - это прочитать запись в массив строк в том порядке, в котором она находится в файле, вы можете просто использовать CsvParser
вместо CsvReader
. Вызов CsvParser.Read()
возвращает a string[]
. CsvReader
использует CsvParser
для чтения необработанных данных.
Ответ 3
Я знаю, что это не связано с CVSHelpers, но вы можете рассмотреть проект FileHelpers
Он позволяет вам декорировать поля на объекте с атрибутами, чтобы он представлял строку в файле csv, а затем использовал FileHelperEngine для чтения файла - в результате был создан массив объектов, каждый из которых представлял строку
см. этот быстрый запуск при чтении файлов с разделителями