读取csv文件块进行处理
本文关键字:处理 csv 文件 读取 | 更新日期: 2023-09-27 18:04:29
我有一个.csv文件,其中有10万条记录,其中有5列。我正在逐行读取它并将其存储在远程数据库中。
以前,我遵循面向性能的方法。我正在逐行阅读。csv文件,在同一事务中,我打开了与数据库的连接并关闭了它。这带来了严重的性能开销。仅仅写一万行,就花了一个小时。
using (FileStream reader = File.OpenRead(@"C:'Data.csv"))
using (TextFieldParser parser = new TextFieldParser(reader))
{
parser.TrimWhiteSpace = true; // if you want
parser.Delimiters = new[] { " " };
parser.HasFieldsEnclosedInQuotes = true;
while (!parser.EndOfData)
{
//Open a connection to a database
//Write the data from the .csv file line by line
//Close the connection
}
}
现在我已经改变了方法。为了测试的目的,我采取了一个.csv文件,有10 000行,在阅读了所有10 000行之后,我连接到数据库,并在那里写它。
现在,唯一的问题是:我想读前1万行并写下来,同样地,读下1万行并写下来,
using (FileStream reader = File.OpenRead(@"C:'Data.csv"))
using (TextFieldParser parser = new TextFieldParser(reader))
,但上面两行将读取整个文件。我不想把它读完。是否有任何方法来读取。csv文件块块每块10000行?
试试下面的代码,它从csv中逐块读取数据
IEnumerable<DataTable> GetFileData(string sourceFileFullName)
{
int chunkRowCount = 0;
using (var sr = new StreamReader(sourceFileFullName))
{
string line = null;
//Read and display lines from the file until the end of the file is reached.
while ((line = sr.ReadLine()) != null)
{
chunkRowCount++;
var chunkDataTable = ; ////Code for filling datatable or whatever
if (chunkRowCount == 10000)
{
chunkRowCount = 0;
yield return chunkDataTable;
chunkDataTable = null;
}
}
}
//return last set of data which less then chunk size
if (null != chunkDataTable)
yield return chunkDataTable;
}