我正在尝试将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 [] 参数)
答案 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上列出的几乎相同的示例。