2

我正在使用FileHelper将记录写入平面文件。这些记录的前 20 个字段是固定的,如果值为空,则会填充空格。而最后 4 个字段是可选的,如果它们都为空,则这些位置不应填充空格。但是FileHelper继续用空格填充这些位置。

是否有可能实现这一目标FileHelper

[FixedLengthRecord(FixedMode.AllowVariableLength)] 
public class MyReport
{
    [FieldFixedLength(2)]
    public string field1;

    [FieldFixedLength(10)] 
    public string field2;
    ...
    [FieldFixedLength(96)] 
    [FieldOptional]
    public string field32;

    [FieldFixedLength(96)]
    [FieldOptional]
    public string field33;

    [FieldFixedLength(96)]
    [FieldOptional]
    public string field34;

    [FieldFixedLength(96)]
    [FieldOptional]
    public string field35;
}
4

2 回答 2

0

AfterWriteRecord您可以删除事件中的任何额外分隔符。

这是一个工作示例:

[DelimitedRecord(",")]
public partial class Person
{
    public string FirstName;
    public string LastName;
    [FieldOptional]
    public string Optional1;
    [FieldOptional]
    public string Optional2;
    [FieldOptional]
    public string Optional3;
}      

class Program
{
    private static void Main(string[] args)
    {
        var engine = new FileHelperEngine<Person>();
        engine.AfterWriteRecord += engine_AfterWriteRecord;
        var export = engine.WriteString(
                     new Person[] { 
                       new Person() { FirstName = "Joe", LastName = "Bloggs" } 
                     });
        Assert.AreEqual("Joe,Bloggs" + Environment.NewLine, export);
    }

    static void engine_AfterWriteRecord(EngineBase engine, AfterWriteEventArgs<Person> e)
    {
        // trim trailing empty separators
        e.RecordLine = e.RecordLine.TrimEnd(',');
    }
}
于 2013-03-21T17:06:26.560 回答
0

我怀疑这是因为您在每个可选字段上都有 FixedLength() 属性。据我所知,可选属性仅在导入时才真正出现,因此如果没有值(null),则不会设置任何内容。

可以在这里找到确认:http ://www.filehelpers.net/docs/html/T_FileHelpers_FieldOptionalAttribute.htm

考虑到您正在尝试做什么,我认为您将需要编写一个自定义转换器来为您处理此问题并取消 fixedwidth 属性。

public sealed class FixedWidth96Converter : ConverterBase
{
    public override string FieldToString(object from)
    {
        string val = from as string;
        if (!string.IsNullOrWhiteSpace(val))
        {
            return val.PadLeft(96, ' ');
        }
        return base.FieldToString(from);
    }

    public override object StringToField(string from)
    {
        return from;
    }
}
于 2015-08-09T18:54:13.373 回答