我正在使用LumenWorks reader CSV阅读器来处理CSV文件。有些文件有100多万条记录。
我想要的是对文件进行分段处理。例如,我想首先处理100,000条记录,验证数据,然后通过Internet连接发送这些记录。发送后,我重新打开该文件并从记录100,001继续。直到我处理完这个文件。在我的应用程序中,我已经创建了跟踪当前正在处理的记录的逻辑。
LumenWorks解析器是否支持从CSV中的预定行开始处理,或者它总是必须从顶部开始?我看到它有一个缓冲变量。有没有办法使用这个缓冲变量来实现我的目标?
my_csv = New CsvReader(New StreamReader(file_path), False, ",", buffer_variable)发布于 2015-02-17 10:28:44
似乎LumenWorks CSV Reader需要从顶部开始-我需要忽略文件中的前n行,并尝试传递位于正确位置/行的StreamReader,但在尝试获取FieldCount时得到Key already exists Dictionary错误(没有重复项)。
然而,我发现了一些成功的方法,首先将预先裁剪的文件读取到StringBuilder中,然后再读取到StringReader中,以允许CSV Reader读取它。你的里程数可能会随着大文件的不同而不同,但它确实有助于裁剪文件:
using (StreamReader sr = new StreamReader(filePath))
{
string line = sr.ReadLine();
StringBuilder sbCsv = new StringBuilder();
int lineNumber = 0;
do
{
lineNumber++;
// Ignore the start rows of the CSV file until we reach the header
if (lineNumber >= Constants.HeaderStartingRow)
{
// Place into StringBuilder
sbCsv.AppendLine(line);
}
}
while ((line = sr.ReadLine()) != null);
// Use a StringReader to read the trimmed CSV file into a CSV Reader
using (StringReader str = new StringReader(sbCsv.ToString()))
{
using (CsvReader csv = new CsvReader(str, true))
{
int fieldCount = csv.FieldCount;
string[] headers = csv.GetFieldHeaders();
while (csv.ReadNextRecord())
{
for (int i = 0; i < fieldCount; i++)
{
// Do Work
}
}
}
}
}你也许能够调整这个解决方案来读取文件的块-例如,当你读完StreamReader时,将不同的“块”分配给一个StringBuilder对象的Collection,如果你想要的话,还可以预先挂起标题行。
发布于 2020-10-08 21:08:36
尝试使用CachedCSVReader而不是CSVReader和MoveTo(长记录号)、MoveToStart等方法。
https://stackoverflow.com/questions/22226952
复制相似问题