我们有几份固定长度记录格式的报告。我们正在使用FileHelpers将它们转换为分隔的记录格式。
由于有几个报告,我们考虑描述固定和分隔的模型并传递给
FileTransformEngine<TSource, TDestination>();
为了使它干,我们可以做类似的事情
Transform<TInput, TOutput>()
{
var engine = new FileTransformEngine<TInput, TOutput>();
engine.TransformFileFast(...);
}
我是C#和泛型的新手,我不知道从哪里开始。
任何人都可以给我一些指导,这是否可行,因为所有模型都已创建,我认为它们在编译时可用。
答案 0 :(得分:2)
文件管理器的文档显示了如何read a fixed file和write a delimited file - 因此在您自己的FileTransformEngine
public class FileTransformEngine<T>
{
public void TransformFileFast(string inputFile, string outputFile)
{
var readEngine = new FixedFileEngine<T>();
T[] records = readEngine.ReadFile(inputFile);
var writeEngine = new FileHelperEngine<T>();
writeEngine.WriteFile(outputFile,records);
}
}
为此,您的课程需要阅读和写作的属性。例如
[FixedLengthRecord()]
[DelimitedRecord("|")]
public class MyRecord
{
[FieldFixedLength(5)] // for reading
[FieldConverter(ConverterKind.Decimal, ".")] // for writing
public decimal Foo{get; set; }
}
然后你会用
var engine = new FileTransformEngine<MyRecord>();
engine.TransformFileFast("from/input.txt","to/output.csv");
如果你想要输入和输出的不同类型,你可以让类采用两种类型(一个输入和一个输出)以及一个用于将一个转换为另一个的谓词。
public class FileTransformEngine<TInput, TOutput>
{
public void TransformFileFast(string inputFile, string outputFile,
Func<TInput,TOutput> transformer)
{
var readEngine = new FixedFileEngine<TInput>();
TInput[] records = readEngine.ReadFile(inputFile);
IEnumerable<TOutput> outputRecords = records.Select(transformer);
var writeEngine = new FileHelperEngine<TOutput>();
writeEngine.WriteFile(outputFile,outputRecords );
}
}
然后用你的两种类型调用
var engine = new FileTransformEngine<MyInputRecord, MyOutputRecord>();
engine.TransformFileFast("from/input.txt","to/output.csv", input => {
//transform input to output.
return new MyOutputRecord();
});