c#FileHelpers将具有可变长度行

时间:2018-05-03 14:11:06

标签: c# csv filehelpers

在接近我的问题的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,所以我想我更像是一个新手。

提前谢谢! 达尼

2 个答案:

答案 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。