C# 将数据从Access插入csv文件的有效方法
我正在尝试将access数据库中的数据插入C中的.csv文件。access数据库中有54744条记录。在CSV文件中插入记录需要2个多小时。下面是我的代码:C# 将数据从Access插入csv文件的有效方法,c#,C#,我正在尝试将access数据库中的数据插入C中的.csv文件。access数据库中有54744条记录。在CSV文件中插入记录需要2个多小时。下面是我的代码: public void CreateCSVFile() { DataSet dsRecLoad = new DataSet(); DataTable dt = new DataTable("RecsCDDt"); StringBuilder sb =
public void CreateCSVFile()
{
DataSet dsRecLoad = new DataSet();
DataTable dt = new DataTable("RecsCDDt");
StringBuilder sb = new StringBuilder();
using (OleDbConnection connection = new OleDbConnection(_configuration.GetConnectionString("AccessConnection")))
{
using (OleDbCommand cmd = new OleDbCommand("select * from RecsCD", connection))
{
connection.Open();
OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.Default);
dt.Load(reader);
}
}
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn dc in dt.Columns)
{
if (!String.IsNullOrEmpty(sb.ToString()))
sb.Append(",");
sb.Append(row[dc.ColumnName].ToString());
}
sb.Append("\n");
}
string CSVfilePath = _configuration.GetValue<string>("MySettings:CSVFile");
if (!File.Exists(CSVfilePath))
{
File.WriteAllText(CSVfilePath, sb.ToString()) ;
}
}
有谁能给我建议一种更有效的方法将记录插入.CSV文件中吗
谢谢。以下是一个小示例,说明如何通过使用读卡器对数据进行流式处理,并将数据作为未经测试的流写入文件,从而实现同样的效果:
await using var textWriter = new StreamWriter("path\\to\\file.csv");
await using var writer = new CsvHelper.CsvWriter(textWriter, CultureInfo.InvariantCulture);
await using var connection = new SqlConnection("connection_string");
await using var cmd = new SqlCommand("select * from RecsCD", connection);
await connection.OpenAsync();
await using var reader = await cmd.ExecuteReaderAsync();
while (await reader.ReadAsync()) {
foreach (int i in Enumerable.Range(0, reader.FieldCount)) {
writer.WriteField(await reader.GetFieldValueAsync<object>(i));
}
await writer.NextRecordAsync();
}
await writer.FlushAsync();
请注意,代码取决于库。以下是一个小示例,说明如何通过使用读卡器将数据流化并将其作为未经测试的流写入文件来实现同样的效果:
await using var textWriter = new StreamWriter("path\\to\\file.csv");
await using var writer = new CsvHelper.CsvWriter(textWriter, CultureInfo.InvariantCulture);
await using var connection = new SqlConnection("connection_string");
await using var cmd = new SqlCommand("select * from RecsCD", connection);
await connection.OpenAsync();
await using var reader = await cmd.ExecuteReaderAsync();
while (await reader.ReadAsync()) {
foreach (int i in Enumerable.Range(0, reader.FieldCount)) {
writer.WriteField(await reader.GetFieldValueAsync<object>(i));
}
await writer.NextRecordAsync();
}
await writer.FlushAsync();
请注意,代码取决于库。使用一个库,您可以将结果流式传输到一个文件,而不是将文件写入一个大的块中。它还将帮助您转义值并执行其他您目前不关心的事情:您可能还可以从读取器流式处理结果,而不是将整个表加载到内存中:使用一个库,您可以将结果流式处理到一个文件中,而不是将文件写入一个大的块中。它还将帮助您转义值和执行其他您目前不关心的事情:您可能还可以从读取器中流式传输结果,而不是将整个表加载到内存中:对于这个特定场景,除了处理转义/行结束之外,没有太多。如果您有一些预定义的要序列化的对象列表,它会变得更有用。此外,该库还有助于反向读取csv文件并将其映射到对象。对不起!我试图尽快收回我的评论,因为我刚刚注意到你上面的评论,它解释了CsvHelper的一些优点。谢谢你的快速回复。这里是我最初的评论问题供参考:我从未使用过CsvHelper库,所以出于好奇,这个库在这个场景中做了什么使它如此有用。谢谢谢谢Evan,我的代码在不到5分钟的时间内执行。对于这个特定场景,除了处理转义/行结束外,没有太多。如果您有一些预定义的要序列化的对象列表,它会变得更有用。此外,该库还有助于反向读取csv文件并将其映射到对象。对不起!我试图尽快收回我的评论,因为我刚刚注意到你上面的评论,它解释了CsvHelper的一些优点。谢谢你的快速回复。这里是我最初的评论问题供参考:我从未使用过CsvHelper库,所以出于好奇,这个库在这个场景中做了什么使它如此有用。谢谢谢谢Evan,我的代码将在不到5分钟内执行。