首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LumenWorks解析器从预定行/行开始处理CSV文件

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

Stack Overflow用户
提问于 2014-03-06 22:09:05
回答 2查看 998关注 0票数 2

我正在使用LumenWorks reader CSV阅读器来处理CSV文件。有些文件有100多万条记录。

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

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

代码语言:javascript
复制
my_csv = New CsvReader(New StreamReader(file_path), False, ",", buffer_variable)
EN

回答 2

Stack Overflow用户

发布于 2015-02-17 10:28:44

似乎LumenWorks CSV Reader需要从顶部开始-我需要忽略文件中的前n行,并尝试传递位于正确位置/行的StreamReader,但在尝试获取FieldCount时得到Key already exists Dictionary错误(没有重复项)。

然而,我发现了一些成功的方法,首先将预先裁剪的文件读取到StringBuilder中,然后再读取到StringReader中,以允许CSV Reader读取它。你的里程数可能会随着大文件的不同而不同,但它确实有助于裁剪文件:

代码语言:javascript
复制
                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,如果你想要的话,还可以预先挂起标题行。

票数 3
EN

Stack Overflow用户

发布于 2020-10-08 21:08:36

尝试使用CachedCSVReader而不是CSVReader和MoveTo(长记录号)、MoveToStart等方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22226952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档