如何将数据从 CSV 文件批量复制到 SQL?
How to bulk copy data from CSV file to SQL?
我这样试过:
public Datatable GetDatatable(){
string[] csv=@"1,ABC,Arun,12/12/2017\n
2,BCD,Sam,10/12/2017\n
3,XYZ,Ammy,11/12/2017\n
4,PQR,Varun,9/12/2017\n";
DataTable table = new DataTable();
table.Columns.Add("Dosage", typeof(int));
table.Columns.Add("Drug", typeof(string));
table.Columns.Add("Patient", typeof(string));
table.Columns.Add("Date", typeof(DateTime));
foreach (var line in csv)
{
string[] l=line.split(',');
table.Rows.Add(l[0]);
table.Rows.Add(l[1]);
table.Rows.Add(l[2]);
table.Rows.Add(l[3]);
}
return table;
}
csv 喜欢
1,ABC,Arun,12/12/2017
2,BCD,Sam,10/12/2017
3,XYZ,Ammy,11/12/2017
4,PQR,Varun,9/12/2017
使用foreach来完成。我想要相同的结果而不使用 for 循环
或 foreach 因为 CSV 包含超过 300 万行。请给点意见或建议。
您可以使用 OLEDB 使用 SQL(有点)查询来读取 CSV 文件:
查看此答案的示例:Most efficient way to process a large csv in .NET
您也可以使用现有的库,例如 FileHelpers:http://www.filehelpers.net/ 它可以轻松快速地解析大型 CSV 文件。
总是会以某种方式执行循环来读取文件,拆分行并将其插入到DataTable中。
有很多免费的库可以处理 CSV 文件,如果您执行简单的搜索,您会很容易找到它们。
但是,您的代码可以通过在该循环中仅拆分一次而不是 4 次并仅添加一行来改进(和修复)代码
(实际上你的代码为每行添加了 4 行,这似乎是错误的)
foreach (var line in csv)
{
string[] parts = line.Split(',');
table.Rows.Add(parts);
}
return table;
如果这足以满足您的要求,则由您自行评估。有这么多行要阅读,我将对不同方法的特性和性能进行广泛比较。 (使用库或自制代码)
这是有效的,不需要第三方使用 SQLBulkCopy 代替
public static void BulInsert()
{
var destination = @"Data Source = (localdb)\MSSQLLocalDB; Initial Catalog = SampleDatabase; Integrated Security = True; Connect Timeout = 30; Encrypt = False; TrustServerCertificate = False; "; // your comnnection string
var filename = @"d:\db.csv";//your source file
var connString = string.Format(@"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=No;FMT=Delimited""", Path.GetDirectoryName(filename));
string query = string.Format("Select * from [{0}]", Path.GetFileName(filename));
using (var conn = new OleDbConnection(connString))
{
conn.Open();
OleDbCommand command = new OleDbCommand(query, conn);
var reader = command.ExecuteReader();
using (SqlConnection destConnection = new SqlConnection(destination))
{
try
{
destConnection.Open();
using (SqlBulkCopy bulkCopy =
new SqlBulkCopy(destConnection))
{
// what ever mapping with ordinal
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(0, "Id"));
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(1, "name"));
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(2, "visit"));
bulkCopy.DestinationTableName =
"dbo.Patients";
try
{
bulkCopy.WriteToServer(reader);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
reader.Close();
}
}
}
catch (Exception)
{
}
}
}
}
如果您想将 CSV 转换为数据表或轻松地将 CSV 批量导入到 sqlserver,您可以使用 Cinchoo ETL 库。
要将 CSV 转换为数据表,下面的代码显示了如何操作
using (var p = new ChoCSVReader("emp.csv").WithFirstLineHeader())
{
DataTable dt = p.AsDataTable();
}
如果你想批量导入 CSV 到 sqlserver,你可以参考这篇 codeproject 文章了解如何做。
Cinchoo ETL - Bulk Insert CSV File into SQLServer
希望这对您有所帮助。
免责声明:我是该库的作者。
我这样试过:
public Datatable GetDatatable(){
string[] csv=@"1,ABC,Arun,12/12/2017\n
2,BCD,Sam,10/12/2017\n
3,XYZ,Ammy,11/12/2017\n
4,PQR,Varun,9/12/2017\n";
DataTable table = new DataTable();
table.Columns.Add("Dosage", typeof(int));
table.Columns.Add("Drug", typeof(string));
table.Columns.Add("Patient", typeof(string));
table.Columns.Add("Date", typeof(DateTime));
foreach (var line in csv)
{
string[] l=line.split(',');
table.Rows.Add(l[0]);
table.Rows.Add(l[1]);
table.Rows.Add(l[2]);
table.Rows.Add(l[3]);
}
return table;
}
csv 喜欢
1,ABC,Arun,12/12/2017
2,BCD,Sam,10/12/2017
3,XYZ,Ammy,11/12/2017
4,PQR,Varun,9/12/2017
使用foreach来完成。我想要相同的结果而不使用 for 循环 或 foreach 因为 CSV 包含超过 300 万行。请给点意见或建议。
您可以使用 OLEDB 使用 SQL(有点)查询来读取 CSV 文件:
查看此答案的示例:Most efficient way to process a large csv in .NET
您也可以使用现有的库,例如 FileHelpers:http://www.filehelpers.net/ 它可以轻松快速地解析大型 CSV 文件。
总是会以某种方式执行循环来读取文件,拆分行并将其插入到DataTable中。
有很多免费的库可以处理 CSV 文件,如果您执行简单的搜索,您会很容易找到它们。
但是,您的代码可以通过在该循环中仅拆分一次而不是 4 次并仅添加一行来改进(和修复)代码 (实际上你的代码为每行添加了 4 行,这似乎是错误的)
foreach (var line in csv)
{
string[] parts = line.Split(',');
table.Rows.Add(parts);
}
return table;
如果这足以满足您的要求,则由您自行评估。有这么多行要阅读,我将对不同方法的特性和性能进行广泛比较。 (使用库或自制代码)
这是有效的,不需要第三方使用 SQLBulkCopy 代替
public static void BulInsert()
{
var destination = @"Data Source = (localdb)\MSSQLLocalDB; Initial Catalog = SampleDatabase; Integrated Security = True; Connect Timeout = 30; Encrypt = False; TrustServerCertificate = False; "; // your comnnection string
var filename = @"d:\db.csv";//your source file
var connString = string.Format(@"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=No;FMT=Delimited""", Path.GetDirectoryName(filename));
string query = string.Format("Select * from [{0}]", Path.GetFileName(filename));
using (var conn = new OleDbConnection(connString))
{
conn.Open();
OleDbCommand command = new OleDbCommand(query, conn);
var reader = command.ExecuteReader();
using (SqlConnection destConnection = new SqlConnection(destination))
{
try
{
destConnection.Open();
using (SqlBulkCopy bulkCopy =
new SqlBulkCopy(destConnection))
{
// what ever mapping with ordinal
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(0, "Id"));
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(1, "name"));
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(2, "visit"));
bulkCopy.DestinationTableName =
"dbo.Patients";
try
{
bulkCopy.WriteToServer(reader);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
reader.Close();
}
}
}
catch (Exception)
{
}
}
}
}
如果您想将 CSV 转换为数据表或轻松地将 CSV 批量导入到 sqlserver,您可以使用 Cinchoo ETL 库。
要将 CSV 转换为数据表,下面的代码显示了如何操作
using (var p = new ChoCSVReader("emp.csv").WithFirstLineHeader())
{
DataTable dt = p.AsDataTable();
}
如果你想批量导入 CSV 到 sqlserver,你可以参考这篇 codeproject 文章了解如何做。
Cinchoo ETL - Bulk Insert CSV File into SQLServer
希望这对您有所帮助。
免责声明:我是该库的作者。