我发现FileHelpers非常方便使用自定义分隔符,带引号的标识符,空项目过滤等来处理“丰富的” CSV。 但这似乎主要是要加载事先已知格式的文件,以创建一个强类型对象列表,并使用认为应该与标头匹配的属性装饰属性。
我的目的有些不同: 我希望能够以诸如DataTable或某种类型的字符串数组之类的灵活格式加载自定义CSV文件,其格式和列数事先未知。旁注:我的csv来自Stream,而不是物理文件。
我在ReadStreamAsDT
中使用了FileHelperEngine
之类的方法(下面有完整的实现),但是遇到了一些问题。
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生成等)获利?
答案 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(如果您愿意)。