使用CSV解析器选择值

时间:2012-12-04 18:53:28

标签: c# parsing csv

我一次抓取一个值并动态加载到网格中。

有没有办法将csv文件索引为只查找某个行和列的值? 我无法读取所有行,因为这会破坏动态加载的目的。

我的情况下,CSV解析器Fast CSV Parser可以获取类似csv[row][column]的值。在查看源代码时,我注意到它遍历文件中的所有内容,直到它到达正确的索引列对。要在第100,000行第80列中获取值,可能需要很长时间。

任何帮助都非常感激。

3 个答案:

答案 0 :(得分:0)

CSV文件不支持索引特定行的位置,编号

我认为你能做的最好就是阅读每一行,直到找到你想要的那一行。因此,在扫描一行时,您将平均读取文件的一半,这比读取整个文件要好。

如果您使用我在文章Reading and Writing CSV Files in C#中提供的CSV解析器,您可以一次只读一行。

另一个选项是您要从同一文件访问多行。在这种情况下,您可以运行该文件并构建索引列表。但是,如果你要在一个会话中查找多行,这只会得到回报。

答案 1 :(得分:0)

好吧,你可以快速进行第一次传递并存储每一行​​的偏移量。这将使随后更快地定位一行。如果你有80列但是100K行,我会专注于快速查找行而不是快速查找列。

ETA:好的,我假设您的CSV文件位于磁盘上,并且您可以获得对它的独占访问权限。其中一些代码基于this

   List<int> offsets = new List<int>();
   using (StreamReader reader = new StreamReader("myfile.csv"))
   {
        int offset = 0;
        string line;
        while ((line = reader.ReadLine()) != null)
        {   
            offsets.Add(offset);             
            offset += (line.Length + 2);   // The 2 is for NewLine(\r\n)
        }
        offsets.Add(offset);  // pick up the last one
    }

在此结束时,您将拥有List变量offsets,该变量由行号索引并包含每行的偏移量。然后,您可以在读取文件时(在进行网格构建时)使用offsets[n]来获取Seek的偏移量(我假设您正在使用FileStream或StreamReader)和{ {1}}获得长度。

就解析返回的文本行而言,我假设您正在调整的CSV库具有良好的逻辑性。

答案 2 :(得分:0)

如果您被允许使用第三方库,我会查看其中的一些。 MySQL具有CSV引擎支持,因此您可以使用它们的库来执行此操作。

然而,C#并不能提供处理CSV文件的好方法。

http://dev.mysql.com/doc/refman/5.0/en/csv-storage-engine.html

相关问题