在文件上传时使用CSVHelper

use*_*794 9 c# csv asp.net-mvc-3 csvhelper

我正在尝试使用CSVhelper插件来读取上传的CSV文件.这是我的modelBinder类:

public class SurveyEmailListModelsModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var csv = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        var file = ((csv.RawValue as HttpPostedFileBase[]) ?? Enumerable.Empty<HttpPostedFileBase>()).FirstOrDefault();

        if (file == null || file.ContentLength < 1)
        {
            bindingContext.ModelState.AddModelError(
                "",
                "Please select a valid CSV file"
            );
            return null;
        }

        using (var reader = new StreamReader(file.InputStream))
        using (var csvReader = new CsvReader(reader))
        {
            return csvReader.GetRecords<SurveyEmailListModels>().ToArray();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这些是我想要映射到的对象:

public class SurveyEmailListModels
{
    [Key]
    [CsvField(Ignore = true)]
    public int SurveyEmailListId { get; set; }

    [CsvField(Index = 0)]
    public int ProgramId { get; set; }

    [CsvField(Index = 1)]
    public virtual SurveyProgramModels SurveyProgramModels { get; set; }

    [CsvField(Index = 2)]
    public string SurveyEmailAddress { get; set; }

    [CsvField(Index = 3)]
    public bool SurveyResponded { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

在Visual Studio调试器内部我收到一个错误:

  • base {"You must call read on the reader before accessing its data."} CsvHelper.CsvHelperException {CsvHelper.CsvReaderException}

Chr*_*den 14

没有使用插件,但错误信息似乎很清楚.Read()在访问结果之前必须有一个函数来调用.尝试将代码更改为以下内容:

using (var reader = new StreamReader(file.InputStream))
using (var csvReader = new CsvReader(reader))
{
    // Use While(csvReader.Read()); if you want to read all the rows in the records)
    csvReader.Read();
    return csvReader.GetRecords<SurveyEmailListModels>().ToArray();
}
Run Code Online (Sandbox Code Playgroud)

  • @ChrisSnowden 你是对的,你需要一个 `Read()` 调用,但是 `GetRecords` 方法为你做了这个,根据 [源](https://github.com/JoshClose/CsvHelper/blob/master /src/CsvHelper/CsvReader.cs#L916)。在 GetRecords() 之前调用 Read() 将跳过第一条记录。也许你有不同的版本? (2认同)