2011-04-22 175 views
11

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

导入代码:
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]' 的方式。

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

谢谢
-Oleg


从“数据”行分别读“头”行解决了这个问题。然后,我更改'data'中的列名并使用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(); 

回答

2

看看FileHelpers的来源,除了更改列名之外,没有什么可以做的。但是,在制作C#字段之前,可以很容易地更改FileHelpers以装饰CSV字段名称。

当然,CSV是不是世界上最复杂的格式 - 如果你知道你没有对付逃脱逗号,然后String.Split(',', myLine)往往是几乎你所需要的。就我个人而言,我怀疑我会引入第三方依赖的麻烦来阅读CSV文件。

+5

使用.Split()解析CSV只是要求问题。 – Patonza 2012-10-29 12:08:15