【问题标题】:Select value with CSV parser使用 CSV 解析器选择值
【发布时间】:2012-12-04 18:53:28
【问题描述】:

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

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

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

非常感谢任何帮助。

【问题讨论】:

    标签: c# parsing csv


    【解决方案1】:

    好吧,您可以快速执行第一遍并存储每行的偏移量。这将使随后定位一行更快。如果您有 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)和 offsets[n+1] - offsets[n] 来获得长度。

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

    【讨论】:

    • 如果我能够索引它们,我会怎么做?另外我怎么会说给我这个索引的行?每一行的字节长度是否可能相同,因此我说第 18 行给我 sizeof(row)*18 ,然后我怎么说从那个字节长度开始并读取行?
    • @EvilWeebl 我会用一些建议来填写我的答案。
    • 看起来很棒!非常感谢,我一定会玩的。
    【解决方案2】:

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

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

    如果您使用我在文章 Reading and Writing CSV Files in C# 中介绍的 CSV 解析器,您一次只能读取一行。

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

    【讨论】:

    • 目前我正在一个一个地获取实际值,因为我在网格中使用未绑定的列并在请求时获取列和行的值,我知道效率不是很高。当它请求第 10 行第 5 列时还不错,因为它只读取了那么远,但是如果您在第 10000 行中查找所有 6 列数据值,这意味着它每次需要读取 10000 行才能获得一个您可以想象的值很慢。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 2018-08-19
      • 2011-02-06
      相关资源
      最近更新 更多