C# 在文件上载中使用CSVHelper

C# 在文件上载中使用CSVHelper,c#,asp.net-mvc-3,csv,csvhelper,C#,Asp.net Mvc 3,Csv,Csvhelper,我正在尝试使用CSVhelper插件来读取上传的CSV文件。这是我的modelBinder类: public class SurveyEmailListModelsModelBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var csv =

我正在尝试使用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();
        }
    }
}
在Visual Studio调试器中,我收到一个错误:

  • base{“在访问读卡器的数据之前,必须在读卡器上调用read。”}CsvHelper.CsvHelperException{CsvHelper.CsvReaderException}


    • 未使用插件,但错误消息似乎非常清楚。在访问结果之前,必须调用
      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();
      }
      
      使用(var reader=newstreamreader(file.InputStream))
      使用(var csvReader=新csvReader(读卡器))
      {
      //使用While(csvReader.Read());如果要读取记录中的所有行)
      csvReader.Read();
      返回csvReader.GetRecords().ToArray();
      }
      
      当我尝试下面的代码时,我也遇到了类似的问题,但已经解决了


      啊!这就成功了——感谢你今天早上在我的大脑加速时帮了我的忙。读取的代码在pate的编辑中被删除了,我现在已经撤销了。请看他的评论,了解他的理由@pate这个错误看起来很明显,需要进行读取调用,所以请不要只是将此更改回原处。理想情况下,添加您自己的新答案,因为您的编辑与我的答案的整个要点相矛盾。OP还确认此解决方案确实有效,因此您的编辑可能是错误的。@Chrisnowden您关于需要调用
      Read()
      的说法是正确的,但是
      GetRecords
      方法会根据为您执行此操作。在GetRecords()之前调用
      Read()
      ,将跳过第一条记录。也许你有一个不同的版本?@pate正如我在回答中所说的,我从未使用过这个插件,但错误表明在访问数据之前需要进行读取;OP确认这解决了问题。但是,可能它允许访问数据,但跳过了第一条记录。希望OP能对此进行测试和验证。如果不需要读取,那么我猜OP不会看到错误?你能建议一个新的答案,说明OP需要对代码进行的更改吗?如果可能的话,我只是不想因为这次编辑而有更多的反对票,因为你修改了代码来反驳我的解释。
      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();
      }
      
      void Main()
      {
          using (var reader = new StreamReader("path\\to\\file.csv"))
          using (var csv = new CsvReader(reader, 
                 System.Globalization.CultureInfo.CreateSpecificCulture("enUS")))
          {
              var records = csv.GetRecords<Foo>();
          }
      }
      
      using (var csvReader = new CsvReader(reader))