我是CsvHelper新手,如果我错过了文档中的一些内容,我很抱歉。
我有一个CSV文件,有200列。通常会有近65000行。将这些行导入很好,直到我在中添加了一个名为"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(String名称)( System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerCommon(Int32 columnCount ),System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32 columnCount),System.Data.SqlClient.SqlBulkCopy.WriteToServer(IDataReader阅读器(System.Data.SqlClient.SqlBulkCopy.WriteToServer(IDataReader阅读器),Haitong.Test.CsvImporter.Program.Main(String[] args),C:\Development\Workspaces\UK OPS数据仓库\UK OPS数据仓库\UK OPS Data Warehouse\Haitong.Test.CsvImporter\Program.cs:line 86
发布于 2019-10-07 18:39:30
您可以通过将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);
}https://stackoverflow.com/questions/58273722
复制相似问题