我是CsvHelper的新手,如果我错过了文档中的内容,我深表歉意。
我有一个包含200个关闭列的CSV文件。通常,将有接近65000行。将这些行导入到SQL数据库表中就可以了,直到我在SQL数据库表中添加了一个名为“ FileId”的新字段-CSV文件中不存在该字段。我希望注入此字段及其相关值。
我该怎么做?
请参见下面我正在使用的代码:
const string fileToWorkWith = @"C:\Data\Fidessa ETP Files\Import\2019\myCsvFile.csv";
Output.WriteLn($"Working with file {fileToWorkWith}.");
const string databaseConnectionString = "Server=MyServer;Database=DB;User Id=sa; Password = xyz;";
Output.WriteLn($"Checking if working file exists.");
if (new System.IO.FileInfo(fileToWorkWith).Exists == false)
{
Output.WriteLn("Working file does not exist.", Output.WriteTypes.Error);
return;
}
Output.WriteLn("Reading file.");
using (var reader = new CsvReader(new StreamReader(fileToWorkWith), true, char.Parse(",") ))
{
reader.Columns = new List<LumenWorks.Framework.IO.Csv.Column>
{
new LumenWorks.Framework.IO.Csv.Column { Name = "FileId", Type = typeof(int), DefaultValue = "1" },
};
reader.UseColumnDefaults = true;
Output.WriteLn("Checking fields in file exist in the Database.");
foreach (var fieldName in reader.GetFieldHeaders())
{
if (Fields.IsValid(fieldName.Replace(" ","_")) == false)
{
Output.WriteLn($"A new field named {fieldName} has been found in the file that does not exist in the database.", Output.WriteTypes.Error);
return;
}
}
using (var sbc = new SqlBulkCopy(databaseConnectionString))
{
sbc.DestinationTableName = "FidessaETP.tableARC_EventsOrderAndFlow_ImportTest";
sbc.BatchSize = 1000;
Output.WriteLn("Mapping available Csv Fields to DB Fields");
foreach (var field in reader.GetFieldHeaders().ToArray())
{
sbc.ColumnMappings.Add(field, field.Replace(" ", "_"));
}
sbc.WriteToServer(reader);
}
}
错误详细信息
消息: 找不到“ FileId”字段标题。参数名称:名称
来源: LumenWorks.Framework.IO
堆栈跟踪:
System.ArgumentException:找不到“ FileId”字段标头。参数 名称:的名称 LumenWorks.Framework.IO.Csv.CsvReader.System.Data.IDataRecord.GetOrdinal(字符串 名称) System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerCommon(Int32 columnCount)在 System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32 columnCount,CancellationToken ctoken) System.Data.SqlClient.SqlBulkCopy.WriteToServer(IDataReader reader)在 Haitong.Test.CsvImporter.Program.Main(String [] args)在 C:\ Development \ Workspaces \ UK OPS数据仓库\ UK OPS数据 Warehouse \ Haitong.Test.CsvImporter \ Program.cs:第86行
答案 0 :(得分:0)
通过将CSV数据加载到DataTable中,将具有默认值的FileId列添加到表中并将DataTable传递到SqlBulkCopy中,您也许可以解决该问题。看起来您当前的解决方案似乎没有将整个文件加载到内存中,因此,如果尝试这种方法,则应该监视内存使用情况。如果您浏览CsvReader的Columns属性的文档,则可能可以使当前的解决方案正常工作。看起来它不符合您尝试使用它的方式。
下面是一个示例,您可以使用DataTable加载文件:
DataTable csvTable = new DataTable();
using (var reader = new StreamReader("path\\to\\file.csv"))
{
using (var csv = new CsvReader(reader, true))
{
csvTable.Load(csv);
}
}
DataColumn newColumn = new DataColumn("FileId", typeof(System.Int32));
newColumn.DefaultValue = 1;
csvTable.Columns.Add(newColumn);
using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString))
{
sbc.WriteToServer(csvTable);
}