使用LumenWorks解析器处理从预定行/行开始的CSV文件

时间:2014-03-06 14:09:05

标签: vb.net lumenworks

我正在使用LumenWorks超棒的CSV阅读器来处理CSV文件。有些文件有超过100万条记录。

我想要的是分段处理文件。例如。我想先处理100,000条记录,验证数据,然后通过Internet连接发送此记录。一旦发送,我然后重新打开文件并从记录100,001继续。直到我完成处理文件。在我的应用程序中,我已经创建了跟踪我当前处理的记录的逻辑。

LumenWorks解析器是否支持CSV中预定行的处理,或者始终必须从顶部开始?我看到它有一个缓冲变量。有没有办法使用这个缓冲变量来实现我的目标?

my_csv = New CsvReader(New StreamReader(file_path), False, ",", buffer_variable)

2 个答案:

答案 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等方法。