Dotnet CSV助手无法解析文件

时间:2019-10-11 19:04:17

标签: c# .net csvhelper

我正在尝试将csv文件解析为给定类的项目列表。我对dotnet世界还很陌生。我正在使用.NET(2.2.402) 这是我班的代码

public class ItemResource
{ 
    public string Msisdn { get; set; }
    public float Amount { get; set; }
    public string PersonName { get; set; }
    public string Message { get; set; }
    public string Description { get; set; }

    /// <summary>
    /// Tells wether or not the customer will receive a notification
    /// </summary>
    /// 
    public int Notify { get; set; }
}

这是我尝试解析文件的代码部分

StreamReader reader = new StreamReader("path-to-file.csv");

var csvReader = new CsvReader(reader);

//csvReader.Configuration.Delimiter = ";";
//csvReader.Configuration.HeaderValidated = null;
var records = csvReader.GetRecords<ItemResource>();

_logger.LogInformation(records.Count().ToString());

foreach(var record in records)
{
    _logger.LogInformation(record.ToString());
}

这是文件的内容

Msisdn, Amount, PersonName, Message, Description, Notify
69947943,150,Name 1,TEST,Test,1
69947943,150,Name 2,TEST,Test,1
69947943,150,Name 3,TEST,Test,1
69947943,150,Name 4,TEST,Test,1
69947943,150,Name 4,TEST,Test,1
69947943,150,Name 5,TEST,Test,1

为进行测试,您可以看到,我对路径进行了编码。这是我得到的错误

  

CsvHelper.HeaderValidationException:名称为“ Msisdn”的标头不是   找到了。如果您期望某些标头丢失并且想要   忽略此验证,请将配置HeaderValidated设置为null。   您还可以更改功能以执行其他操作,例如   记录问题。在   CsvHelper.Configuration.ConfigurationFunctions.HeaderValidated(Boolean   isValid,String [] headerNames,Int32 headerNameIndex,ReadingContext   上下文),位于CsvHelper.CsvReader.ValidateHeader(ClassMap map)   CsvHelper.CsvReader.GetRecordsT + MoveNext()在   System.Linq.Enumerable.Count [TSource](IEnumerable`1源)位于   OMBulkPayment.Controllers.PaymentsController.Payment(SavePaymentResource   资源)   C:\ Users \ BMHB8456 \ source \ repos \ OMBulkPayment \ OMBulkPayment \ Controllers \ PaymentsController.cs:line   59 at lambda_method(Closure,Object,Object [])在   Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object   目标,Object []参数)位于   Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper   映射器,ObjectMethodExecutor执行器,对象控制器,Object []   参数)

3 个答案:

答案 0 :(得分:0)

明确设置定界符。替换行

//csvReader.Configuration.Delimiter = ";";

csvReader.Configuration.Delimiter = ",";

默认定界符取决于系统的区域设置(称为列表分隔符)。

还请删除csv文件的标题名称之间的空格。保持它们如下所示:

Msisdn,Amount,PersonName,Message,Description,Notify

答案 1 :(得分:0)

不太确定CsvHelper,但实际上不需要任何额外的组件即可原生读取CSV文件...您可以使用OleDb将其作为平面数据文件读取:

Tip

这还有一个优势,它能够通过更改SELECT查询来查询要返回的特定行,您也可以将其作为参数传递。如果您绝对希望输入数据而不是字符串,则只需在数据表上手动创建列,然后在适配器上调用Fill()。

答案 2 :(得分:0)

使用CSVHelper很不错,它是一个开源项目,是我发现最容易使用的库。

我对您的测试数据进行了以下尝试,并能够成功使之运行:

void Main()
{
    using (var reader = new StreamReader("D:\\PROJECTS\\2019\\DVP_Salary_Payment_Local\\Payment\\test_2.csv"))
    using (var csv = new CsvReader(reader))
    {
        csv.Configuration.Delimiter = ",";
        var records = csv.GetRecords<ItemResource>();
    }
}

public class ItemResource
{
    public string Msisdn { get; set; }

    public float Amount { get; set; }

    public string PersonName { get; set; }

    public string Message { get; set; }

    public string Description { get; set; }

    public int Notify { get; set; }
}

您可以查看其网站here上列出的几乎相同的示例。