Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用FileHelper将可变长度记录写入文件?_C#_Filehelpers - Fatal编程技术网

C# 使用FileHelper将可变长度记录写入文件?

C# 使用FileHelper将可变长度记录写入文件?,c#,filehelpers,C#,Filehelpers,我正在使用FileHelper将记录写入平面文件。 这些记录的前20个字段是固定的,如果值为空,则将填充空格。 尽管最后4个字段是可选的,但如果它们都为空,则这些位置不应填充空格。但是FileHelper继续用空格填充这些位置 是否可以使用FileHelper实现这一点 [FixedLengthRecord(FixedMode.AllowVariableLength)] public class MyReport { [FieldFixedLength(2)] public s

我正在使用
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;
}

您可以在中删除任何额外的分隔符

下面是一个工作示例:

[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(',');
    }
}
[分隔符记录(“,”)]
公共部分阶级人士
{
公共字符串名;
公共字符串LastName;
[字段可选]
公共字符串选项1;
[字段可选]
公共字符串选项2;
[字段可选]
公共字符串选项3;
}      
班级计划
{
私有静态void Main(字符串[]args)
{
var engine=new FileHelperEngine();
engine.AfterWriteRecord+=engine_AfterWriteRecord;
var export=engine.WriteString(
新人【】{
新人(){FirstName=“Joe”,LastName=“Bloggs”}
});
Assert.AreEqual(“Joe,Bloggs”+Environment.NewLine,export);
}
静态无效引擎\u后写记录(引擎基础引擎,后写事件目标e)
{
//纵倾空分离器
e、 RecordLine=e.RecordLine.TrimEnd(',');
}
}

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

可在此处找到这方面的确认:

考虑到您正在尝试做的事情,我认为您需要编写一个自定义转换器来处理这个问题,并去掉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;
    }
}

有没有一种方法可以使用FileHelpers添加条件语句?我同意FieldOptional语句,因为在写入时,列标题必须与数据匹配,而且FileHelpers在处理所有字段之前不会知道所有列都是空的,所以没有通用的方法可以这样做。您可以使用.RemoveField()函数删除字段,但您将从所有行而不仅仅是一行中删除该字段。对于看到这一点并认为正常命名约定建议这应该是在写前而不是写后进行的人,代码实际上会在写前调用,然后将字段转换为一行文本,调用AfterWrite,然后实际写入文本。不存在真正的“数据写入文件后”事件,并且后写实际上仍然是一个预写事件。