0

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

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

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

非常感谢任何帮助。

4

3 回答 3

0

CSV 文件不支持对特定行可能存在的位置进行索引,不。

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

如果您使用我在用 C# 读取和写入 CSV 文件一文中介绍的 CSV 解析器,您一次只能读取一行。

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

于 2012-12-04T18:55:38.130 回答
0

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

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

   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)并offsets[n+1] - offsets[n]获取长度。

就解析返回的文本行而言,我认为您正在适应的 CSV 库对此具有良好的逻辑。

于 2012-12-04T18:55:49.737 回答
0

如果您被允许使用 3rd 方库,我会看看其中的一些。MySQL 支持 CSV 引擎,因此您似乎可以使用它们提供的库来执行此操作。

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

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

于 2012-12-04T20:28:16.677 回答