在接近我的问题的this post之后,我需要一些设置FileHelper的帮助。我的银行对账单在实际交易数据之上有一些额外的信息,因此文件如下所示:
Some Header 1,Some Header 2,And Header 3
<summary of the entire file on 5 lines>
Date,Transaction Type,Description,Amount,Running Balance
<actual transaction data, on 5 columns each line>
我有兴趣捕获所有字段(在DataTable中),包括摘要。基本上,我希望根据任何行中的最大列数来调整数据表的大小。
Prasanth提出了另一种选择,但我不明白_fileContent
是什么:
using (MemoryStream stream = new MemoryStream(_fileContent)) //file content can be file as byte array
我已经在VBA中编写了多年的代码,并且最近在c#中启动了一个Excel Com-AddIn,所以我想我更像是一个新手。
提前谢谢! 达尼
答案 0 :(得分:0)
使用Cinchoo ETL - 一个开源库,您可以加载可变长度的CSV文件。以下示例显示了如何
string csv = @"Id, Name, City
1, Tom, NY
2, Mark, NJ, 100
3, Lou, FL
4, Smith, PA
5, Raj, DC";
StringBuilder sb = new StringBuilder();
using (var p = ChoCSVReader.LoadText(csv)
.WithFirstLineHeader(true) //Ignore the header line to handle the variable length CSV lines
.Configure(c => c.MaxScanRows = 5) //Set the max scan rows to the highest to figure out the max fields
.Configure(c => c.ThrowAndStopOnMissingField = false)
)
{
foreach (var rec in p)
Console.WriteLine(rec.DumpAsJson());
}
Checkout CodeProject文章提供了一些额外的帮助。
免责声明:我是这个图书馆的作者。
答案 1 :(得分:0)
FileHelpers MultiRecordEngine可能对此有所帮助,前提是您能够编写一个记录选择器,该记录选择器可以查看字符串记录并决定您要用于读取该行的格式。
通常情况下,当你有一个明显的记录类型指标时,这种方法效果最好 - 在这种情况下,该行的第一个字符表示记录类型:
if (recordLine.Length == 0)
return null; // no record will be read
int action = int.Parse(recordLine.Substring(0, 1));
switch (action) {
case 0:
case 1:
return typeof(RecTypeOne);
case 2:
return typeof(RecTypeTwo);
case 3:
return typeof(RecTypeThree);
default:
return null; // again, no record is read
在您的情况下,您可能能够根据行中的逗号数量做出此决定,这意味着字段数量,但实际的确定性记录类型指标更可取,IMO。