使用文件帮助程序将动态 CSV 读取到数据表



我发现FileHelpers非常方便处理"丰富"的CSV,具有自定义分隔符,引号标识符,空项目过滤等。 但它似乎主要是为了加载预先已知格式的文件,以创建一个强类型对象列表,其中的属性装饰有应该与标头匹配的属性。

我的目的有点不同: 我希望能够以灵活的格式(如 DataTable 或某种字符串数组)加载自定义 CSV 文件,格式和列数事先不知道。附带评论:我的csv来自Stream,而不是来自物理文件。

我做了一些尝试,使用FileHelperEngine中的ReadStreamAsDT等方法(下面的完整实现),但我遇到了一些问题。

  • 如果标头包含不能出现在 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 生成等)

在我写这个问题的时候,我刚刚编写了自己的代码,将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。

最新更新