12

我正在使用 FileHelpers 库将 csv 文件导入数据库表。我在导入文件头中的字段以数字 ('800NUMBER') 开头的文件时遇到问题。

要导入的代码:
DataTable data = CommonEngine.CsvToDataTable(file, ',');

例外:
FileHelpers.FileHelpersException: The string '800NUMBER' not is a valid .NET identifier. at FileHelpers.RunTime.FieldBuilder..ctor(String fieldName, String fieldType) at FileHelpers.RunTime.DelimitedClassBuilder.AddField(String fieldName, String fieldType) at FileHelpers.RunTime.CsvClassBuilder.AddField(String fieldName, String fieldType) at FileHelpers.RunTime.DelimitedClassBuilder.AddField(String fieldName) at FileHelpers.RunTime.CsvClassBuilder..ctor(CsvOptions options) at FileHelpers.CsvEngine.CsvToDataTable(String filename, String classname, Char delimiter, Boolean hasHeader) at FileHelpers.CommonEngine.CsvToDataTable(String filename, Char delimiter)

我不确定是否有办法转义列名,如“[800NUMBER]”。

列名不能更改,因为这是客户提供给我们的方式。


通过与“数据”行分开读取“标题”行解决了这个问题。然后,我更改了“数据”中的列名并使用 SqlBulkCopy 导入数据库。

    FileHelpers.CsvOptions options = new FileHelpers.CsvOptions("ImportRecord", ',', file);
    options.HeaderLines = 0;        

    FileHelpers.CsvEngine engine = new FileHelpers.CsvEngine(options);

    engine.Options.IgnoreFirstLines = 0; 
    DataTable header = engine.ReadStringAsDT(FileHelpers.CommonEngine.RawReadFirstLines(file, 1)); 

    engine.Options.IgnoreFirstLines = 1;
    DataTable data = engine.ReadFileAsDT(file); 

    for (int i = 0; i < header.Columns.Count; i++)
        data.Columns[i].ColumnName = header.Rows[0][i].ToString();
4

1 回答 1

2

查看 FileHelpers 的源代码,除了更改列名之外,您无能为力。但是,您可以很容易地更改 FileHelpers 以在创建 C# 字段之前装饰 CSV 字段名称。

当然,CSV 不是世界上最复杂的格式——如果您知道不必处理转义逗号,那么String.Split(',', myLine)通常几乎就是您所需要的。就我个人而言,我怀疑我是否会为了读取 CSV 文件而引入第 3 方依赖的麻烦。

于 2011-04-22T17:01:38.567 回答