在这里,我必须使用FileHelpers和C#写出一个记录为Pipe Separated的文件。大部分字段都有可变长度(因此,我的记录将是[DelimitedRecord(“|”)])。但是某些字段必须具有固定长度(它们必须具有填充,特定格式等)。
我已经搜索过一堆没有达成目标的目标。
示例:
[DelimitedRecord("|")]
public class Customer
{
public int CustId; //variable length
public string Name; //variable length
public decimal Balance; //variable length
[FieldConverter(ConverterKind.Date, "dd-MM-yyyy")]
public DateTime AddedDate;
public int Code; // this one must have 10 characters with "zero-fill", like
// 153 must look like 0000000153
}
我如何做到这一点?我是否必须使用转换器方法并为此编写自己的转换器?
提前谢谢。
答案 0 :(得分:4)
对于将来遇到此问题的任何人,这里有一些工作代码来解决这个问题。
此类是一个转换器,FileHelper引擎将使用该转换器将整数转换为字符串,填充为0,最大为构造函数中指定的大小。
public class PaddedIntConverter:ConverterBase
{
private int _size;
public PaddedIntConverter(int size)
{
_size = size;
}
public override object StringToField(string from)
{
return int.Parse(from);
}
public override string FieldToString(object from)
{
return from.ToString().PadLeft(_size,'0');
}
}
然后可以将转换器应用到您的班级,如下所示:
[FixedLengthRecord(FixedMode.ExactLength)]
public class MyClass{
[FieldFixedLength(7)]
[FieldConverter(typeof(PaddedIntConverter), 7)]
public int RecordCount;
}
答案 1 :(得分:1)
FileHelpers有一个属性[FieldFixedLength(xxx)],我相信这可以帮到你找到你想要的东西(http://filehelpers.sourceforge.net/attributes.html)。
答案 2 :(得分:0)
如@TYY所述,我写了自己的" multiuse"转换器,就像这样:
public StringNumberCharConverter(
string Size,
string PaddingChar,
string PaddingType,
string RemoveSpecialChars)
{
//implementation here
}
由于FileHelpers转换器只接受字符串args,因此我必须解析Converter构造函数中正确对象的所有内容。
对于参数,我已经转换了"尺寸"到"整数",PaddingChar到" char",PaddingType到自定义填充类型枚举(即:Padding.LEFT或Padding.RIGHT,所以如果"左&# 34;是从参数中提取的,我应该使用String.PadLeft()等等,以及" RemoveSpecialChars"参数被转换为布尔值(用于检查转换器是否应删除特殊字符的标志。)
由于我需要对象到文件的转换,所有的转换逻辑都在" FieldToString" ConverterBase抽象方法的方法实现。