使用FileHelper将可变长度的记录写入文件
本文关键字:记录 文件 FileHelper 使用 | 更新日期: 2023-09-27 17:55:01
我使用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;
}
您可以在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(',');
}
}
我怀疑这可能是因为在每个可选字段上都有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;
}
}