C# 文件助手:制表符分隔文件中的空值

4
我正在使用FileHelpers解析一个制表符分隔的文件。
在使用FieldNullValue属性后,空值被忽略了,结果导致出现错误日志:
“在第4行字段'filed name'之后找不到(记录的字段数目较少,分隔符错误或下一个字段必须标记为可选)。”
分隔符的类定义:
[DelimitedRecord("\t")]

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

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

查看十六进制编辑器中导入的文件,我可以看到连续的制表符(09 09),我认为这应该是一个空字段。

file line in hex view

如您在屏幕截图中所见,第5个和第9个字段为空。这些将被filehelper解析器忽略。是否有人知道为什么?


什么是问题? - Mert Gülsoy
为什么空值没有被 FieldNullValue 属性替换,而是抛出有关字段数量的错误? - R Davies
你的意思是更改输入格式吗?如果是这样,那不是一个选项。我正在考虑通过编程先编辑文件以将所有双制表符替换为空字符串,但我真的不想走这条路。 - R Davies
你的模型是否允许字段5和9为空? - Mert Gülsoy
2个回答

3
我认为你有两个问题。
首先,FileHelpers需要多一个制表符。一个简单的解决方法是使用[FieldOptional]属性标记最后一个字段。
其次,FieldNullValue("NULL")的意思是:如果文件中该字段的值为null,则将其设置为字符串"NULL"。你的文件中的值是"",而不是null。如果你需要将空值转换为其他值,可以使用自定义转换器,如下所示:
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;

1
删除属性:

[FieldTrim(TrimMode.Both)]

似乎已经解决了问题。

1
我正要写这个。 - Mert Gülsoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接