Мне нужно написать HttpPostedFileBase
csv (и сохранить его) после сопоставления его со списком с помощью пакета nuget CsvHelper. Однако после сопоставления с помощью CsvHelper значение ContentLength
равно 0, и в итоге я сохраняю пустой файл .csv.
CsvHelper сам утверждает, что метод Read не должен использоваться при использовании метода GetRecords<T>()
.
// Summary:
// Gets all the records in the CSV file and converts each to System.Type T. The
// Read method should not be used when using this.
//
// Type parameters:
// T:
// The System.Type of the record.
//
// Returns:
// An System.Collections.Generic.IEnumerable`1 of records.
public virtual IEnumerable<T> GetRecords<T>();
Я попытался поместить его в переменную копирования:
HttpPostedFileBase csvCopy = csvFile;
Но это не сработало. Попробовал некоторые другие решения, которые я нашел в stackoverflow, которые тоже не работали. Я «решил» эту проблему, дважды отправив один и тот же файл на контроллер в качестве параметра. Затем я использую первый с CsvHelper, и я читаю и сохраняю другой.
public async Task<ActionResult> ImportCSV(HttpPostedFileBase csvFile, HttpPostedFileBase csvFileCopy)
Однако я думаю, что это плохое решение. Я хотел бы использовать один файл, отобразить его, перечитать и сохранить.
Отображение в список:
using(var reader = new StreamReader(csvFile.InputStream)) {
using(var csvReader = new CsvReader(reader)) {
csvReader.Configuration.RegisterClassMap(new CSVModelMap(mapDictionary));
csvReader.Configuration.BadDataFound = null;
csvReader.Configuration.HeaderValidated = null;
csvReader.Configuration.MissingFieldFound = null;
importData = csvReader.GetRecords<CSVModel>().ToList();
}
}
Сохранение:
var fileName = serverPath + "\\" + hashedFileName;
CheckIfDirectoryExists(serverPath);
var reader = new StreamReader(csvFile.InputStream);
var csvContent = await reader.ReadToEndAsync();
File.WriteAllText(fileName, csvContent);