我正在使用LumenWorks
超棒的CSV阅读器来处理CSV文件。有些文件有超过100万条记录。
我想要的是分段处理文件。例如。我想先处理100,000条记录,验证数据,然后通过Internet连接发送此记录。一旦发送,我然后重新打开文件并从记录100,001继续。直到我完成处理文件。在我的应用程序中,我已经创建了跟踪我当前处理的记录的逻辑。
LumenWorks解析器是否支持CSV中预定行的处理,或者始终必须从顶部开始?我看到它有一个缓冲变量。有没有办法使用这个缓冲变量来实现我的目标?
my_csv = New CsvReader(New StreamReader(file_path), False, ",", buffer_variable)
答案 0 :(得分:2)
似乎LumenWorks CSV Reader
需要从顶部开始 - 我需要忽略文件中的前n行,并尝试传递位于正确位置/行的StreamReader
,但是我尝试获取Key already exists
时没有Dictionary
FieldCount
错误(没有重复项)。
但是,我已经找到了一些成功,首先将预先修剪的文件读入StringBuilder
然后再读入StringReader
以允许CSV阅读器读取它。您的里程可能因巨大的文件而异,但它确实有助于修剪文件:
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
时,分配不同的&#34;块&#34;到Collection
StringBuilder
个{{1}}个对象,如果需要,还可以预先标记标题行。
答案 1 :(得分:0)
尝试使用CachedCSVReader而不是CSVReader和MoveTo(long recordnumber),MoveToStart等方法。