【问题标题】:C# FileHelpers Nulls in Tab Delimited file制表符分隔文件中的 C# FileHelpers Nulls
【发布时间】:2014-08-28 12:19:59
【问题描述】:

我正在使用 FileHelpers 解析一个制表符分隔的文件。

使用FieldNullValue 属性后,空值被忽略,我最终得到错误日志

在第 4 行的 'filed name' 字段后找不到(记录的字段较少,分隔符错误或必须将下一个字段标记为可选)。

分隔符的类定义:

[DelimitedRecord("\t")]

字段都是具有相同属性的字符串:

 [FieldTrim(TrimMode.Both)]
 [FieldNullValue("NULL")]
 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
 public String initials;

在十六进制编辑器中查看导入的文件,我可以看到背靠背标签字符 (09 09),我认为这是一个空字段。

正如您在屏幕截图中看到的那样,字段 5 和 9 为空。这些会被 filehelper 解析器忽略。有谁知道为什么?

【问题讨论】:

  • 问题是什么?
  • 为什么空值没有被 FieldNullValue 属性替换,而不是抛出关于字段数的错误
  • 你的意思是改变输入格式吗?如果是这样,那么它不是一个选择。我正在考虑首先以编程方式编辑文件以将所有双制表符替换为空白字符串的路线,但并不想走这条路线。
  • 您的模型是否允许 field5 和 9 的可空字段?

标签: c# filehelpers


【解决方案1】:

我认为你有两个问题。

首先,FileHelpers 期待多一个选项卡。一个简单的解决方法是使用 [FieldOptional] 属性标记最后一个字段。

其次,FieldNullValue("NULL")表示:如果文件中字段的值为null,则设置为字符串“NULL”。您文件中的值是"",而不是null。如果需要将空值转换为其他值,可以使用a custom converter,如下:

public class MyEmptyFieldConverter : ConverterBase
{
    protected override bool CustomNullHandling
    {
        /// you need to tell the converter not 
        /// to handle empty values automatically
        get { return true; } 
    }

    public override object StringToField(string from)
    {
        if (String.IsNullOrWhiteSpace(from))
            return "NULL";
        return from;
    }
}

然后将属性添加到您的字段中。

[FieldConverter(typeof(MyEmptyFieldConverter))]
public string field9;

【讨论】:

    【解决方案2】:

    删除属性:

    [FieldTrim(TrimMode.Both)]
    

    似乎已经解决了问题。

    【讨论】:

    • 我正要写这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多