c# - FileHelpers - 错误转换 '"""ID""' to type: ' Int32'

标签 c# .net-4.5 filehelpers

csv 文件中的 IntValue1 是一个没有双引号的数字,但是当系统读取该行时,它会在开头添加双引号,并在行尾添加双引号和分号来分隔该行。因此,IntValue1 以双引号开头,系统无法将其识别为 int... 请帮助我修复此错误。

模型:

[DelimitedRecord(",")]
public class MyObject
{
    private int _ID;
    public int ID
    {
        get { return _ID; }
        set { _ID = value; }
    }
    private DateTime _EventDate;
    public DateTime EventDate
    {
        get { return _EventDate; }
        set { _EventDate = value; }
    }
    private string _IPAddress;
    public string IPAddress
    {
        get { return _IPAddress; }
        set { _IPAddress = value; }
    }
}

读取和显示数据的代码:

private static void GetCsvData()
{
   var engine = new FileHelperEngine<MyTypeObj>();

   //The error occurs at this line:
   var result = engine.ReadFile("C:\\CsvFileName.csv");

   //Code to display the Data
}

CSV 文件如下所示:

enter image description here

错误发生时调试器返回的行内容: enter image description here

错误: enter image description here

最佳答案

问题 #1:您的文件不是有效的 CSV。解决此问题的正确方法是更正文件的导出方式,因为它未导出有效的 CSV 文件。

这不是有效的 CSV 文件:

"ID,""EventDate"",""IPAddress""";
"1,""2013-01-19"",""11.81.11.00""";
"2,""2012-11-25"",""11.72.41.84""";
"3,""2011-12-27"",""15.80.";"3.36"""
"4,""2014-08-17"",""17.72.";"9.24"""
"5,""2012-01-30"",""90.94.27.108""";
"6,""2013-02-15"",""19.97.27.189""";

技巧:您可以使用 FileHelpers 通过 BeforeReadRecord 事件导入无效的 CSV 文件。有时您无法控制您可能会收到用于导入的 CSV 文件。

您的模型:

[IgnoreFirst]
[DelimitedRecord(",")]
public class MyTypeObj
{
    [FieldConverter(ConverterKind.Int32)]
    public int ID;

    [FieldQuoted]
    [FieldConverter(ConverterKind.Date, "yyyy-mm-dd")]
    public DateTime EventDate;

    [FieldQuoted]
    public string IPAddress;
}

您的代码:

var engine = new FileHelperEngine<MyTypeObj>();

engine.BeforeReadRecord += (@base, args) =>
{
    // Convert this: "1,""2013-01-19"",""11.81.11.00""";
    //      to this: 1,"2013-01-19","11.81.11.00"
    args.RecordLine = args.RecordLine
        .Substring(1, args.RecordLine.Length - 3)
        .Replace("\"\"", "\"");
};

var result = engine.ReadFile(@"C:\CsvFileName.csv");

这些行你仍然会有问题(为什么值中间有一个分号???):

"3,""2011-12-27"",""15.80.";"3.36"""
"4,""2014-08-17"",""17.72.";"9.24"""

您也可以在 BeforeReadRecord 中修复这些问题,但最好弄清楚导出出了什么问题。

tl;dr 修复文件的导出方式,以便您获得有效的 CSV。修复导入应该只是最后的手段。

关于c# - FileHelpers - 错误转换 '"""ID""' to type: ' Int32',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32461944/

相关文章:

c# - FileHelpers 在字段中编写带有换行符的 CSV

命名空间 System 中不存在 Json

c# - 为什么 System.Reflection.IntrospectionExtensions.GetTypeInfo 有无法访问的代码?

c# - 对列表中的值进行分组并使用 C# 将输出转换为 JSON

c# - 为什么我需要两次调用来流式传输 CopyTo?

c# - 在重负载操作期间引入异步的简单方法

制表符分隔文件中的 C# FileHelpers 空值

.net - 使用 FileHelpers 输出格式化

c# - 在 WPF 中限制 "Auto"和 "1*"上的行高

c# - 如何从 Unity 应用程序启动 Android Activity ?