使用FileHelpers读取动态CSV到DataTable

时间:2019-05-29 13:24:39

标签: c# .net csv filehelpers

我发现FileHelpers非常方便使用自定义分隔符,带引号的标识符,空项目过滤等来处理“丰富的” CSV。 但这似乎主要是要加载事先已知格式的文件,以创建一个强类型对象列表,并使用认为应该与标头匹配的属性装饰属性。

我的目的有些不同: 我希望能够以诸如DataTable或某种类型的字符串数组之类的灵活格式加载自定义CSV文件,其格式和列数事先未知。旁注:我的csv来自Stream,而不是物理文件。

我在ReadStreamAsDT中使用了FileHelperEngine之类的方法(下面有完整的实现),但是遇到了一些问题。

  • 如果标头包含空格或其他不能在C#属性中显示的字符,则会引发异常“ The string 'My field' not is a valid .NET identifier”。我的标题可以包含所有类型的字符。
  • 它需要分别手动分析标题行

我的实现出现上述问题:

using (var streamReader = new StreamReader(stream, true))
{   
    var cb = new DelimitedClassBuilder("temp", ";")
    {
        IgnoreFirstLines = 0,
        IgnoreEmptyLines = true,
        Delimiter = ";"
    };
    var headerArray = streamReader.ReadLine().Split(';');
    foreach (var header in headerArray)
    {
        cb.AddField(header, typeof(string));
        cb.LastField.FieldQuoted = true;
        cb.LastField.QuoteChar = '"';
    }

    var engineType = cb.CreateRecordClass();
    var engine = new FileHelperEngine(engineType);
    var datatable = engine.ReadStreamAsDT(streamReader);
}

我想避免导入除FileHelpers之外的另一个CSV包,并且由于我们以后还需要使用相同的逻辑生成一些CSV,因此我想避免为此编写自己的代码。

FileHelpers文档对DataTable的使用没有太大帮助。

我还注意到了CommonEngine.CsvToDataTable()CsvEngine.CsvToDataTable()之类的单行方法,但该方法旨在用于物理文件。

是否可以通过FileHelpers来利用某些高级功能(安全报价处理,修剪,CSV生成等)获利?

1 个答案:

答案 0 :(得分:0)

在我撰写问题时,我刚刚编写了自己的代码,以将CSV文件加载到具有所需所有功能的数据表中。

但是,除了FileHelpers之外,还有一个库在该字段中做得更好:“ CsvHelper ”:https://joshclose.github.io/CsvHelper/https://joshclose.github.io/CsvHelper/examples/data-table/

using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader))
{
    // Do any configuration to `CsvReader` before creating CsvDataReader.
    using (var dr = new CsvDataReader(csv))
    {        
        var dt = new DataTable();
        dt.Load(dr);
    }
}

(如果需要自定义分隔符,请设置分隔符,等等)

或者您可以根据需要手动进行操作: https://github.com/JoshClose/CsvHelper/issues/1142#issuecomment-432910368(如果您愿意)。