如何在FixedLength和Delimited records之间进行转换?

时间:2017-05-24 13:54:46

标签: c# filehelpers

我正在尝试读取固定长度的文件并将其转换为分隔的文件格式以便在Excel中使用。使用FileHelpers库我能够读/写这些格式中的任何一种,但是我在它们之间进行转换时遇到了麻烦。

我最接近的方法是为记录声明一个抽象类,我在其中声明字段,指定顺序并使用任何转换器。然后从该抽象类派生一个分隔记录和固定长度记录的类。我设法让这个工作直到我尝试创建固定长度引擎,此时我得到一个例外,显然有些属性没有。

这是我到目前为止所拥有的:

void Main()
{   
    // Arrange
    var delimitedEngine = new FileHelperEngine<CustomerDelimitedRecord>();
    var fixedLengthEngine = new FileHelperEngine<CustomerFixedLengthRecord>();
    var input = @"C:\input.csv";
    var output = @"C:\output.csv";

    // Act
    var records = (CustomerRecord[]) delimitedEngine.ReadFile(input);
    fixedLengthEngine.WriteFile(output, (CustomerFixedLengthRecord[])records);
}

// Define other methods and classes here
public abstract class CustomerRecord
{
    [FieldOrder(2)]
    public string Name;

    [FieldOrder(1)]
    public int ID;
}

[DelimitedRecord(",")]
public class CustomerDelimitedRecord : CustomerRecord
{
}

[FixedLengthRecord]
public class CustomerFixedLengthRecord : CustomerRecord
{
    [FieldFixedLength(50)]
    public new string Name;

    [FieldFixedLength(5)]
    public new int ID;
}

这似乎没有任何错误,但我得到以下运行时异常:

  

错误的使用例外

     

字段:'Name'必须标记为FieldFixedLength属性   因为记录类标有FixedLengthRecord。

我不确定自己是否走在正确的轨道上,但我对任何建议持开放态度。我觉得这仍然不是最好的解决方案,因为我必须为固定长度记录类编写两次字段,但至少我不必写两次属性并保存自己一些映射代码。 / p>

顺便说一句,我应该至少使用autoproperties,但FileHelpers的限制意味着我不能,因为我需要使用自定义转换器。

0 个答案:

没有答案