2011-04-22 19 views
11

Estoy usando la biblioteca FileHelpers para importar archivos csv en la tabla de la base de datos. Tengo un problema al importar el archivo que tiene el campo que comienza con el número ('800NUMBER') en el encabezado del archivo.Problema al importar archivos CSV usando FileHelpers

Código a importar:
DataTable data = CommonEngine.CsvToDataTable(file, ',');

Excepción:
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)

no estoy seguro de si hay una manera de escapar del nombre de la columna como '[800NUMBER]'.

El nombre de la columna no se puede cambiar porque así nos lo proporciona el cliente.

Gracias,
-Oleg


solucionado este problema mediante la lectura de la fila 'cabecera' por separado de las filas de los 'datos'. Luego, cambio los nombres de las columnas en los 'datos' y uso SqlBulkCopy para importar a la base de datos.

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(); 

Respuesta

2

Al ver la fuente de FileHelpers, no hay mucho que pueda hacer al respecto, salvo cambiar el nombre de la columna. Sin embargo, puede cambiar FileHelpers bastante fácilmente para decorar el nombre de campo CSV antes de crear los campos C#.

Por supuesto, CSV no es más compleja formato del mundo - si sabe que no tiene que lidiar con comas escapado, entonces String.Split(',', myLine) es a menudo más o menos todo lo que necesita. Personalmente, dudo que introduzca la molestia de una dependencia de terceros solo para leer archivos CSV.

+5

Analizar CSV con .Split() solo está pidiendo problemas. – Patonza

Cuestiones relacionadas