Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用CSV解析器选择值_C#_Parsing_Csv - Fatal编程技术网

C# 使用CSV解析器选择值

C# 使用CSV解析器选择值,c#,parsing,csv,C#,Parsing,Csv,我一次获取一个值,并将其动态加载到网格中 是否有一种方法可以索引csv文件,使其仅在特定行和列中查找值? 我无法读取所有的行,因为这样会破坏动态加载的目的 在我的例子中,CSV解析器可以获取CSV[row][column]这样的值。当查看源代码时,我注意到它在文件中的所有内容上循环,直到到达正确的索引列对为止。要获取第100000行第80列的值,可能需要相当长的时间 非常感谢您的帮助。CSV文件不支持在特定行所在的位置建立索引,不支持 我认为你能做的最好的事情就是阅读每一行,直到你找到你想要的那

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

是否有一种方法可以索引csv文件,使其仅在特定行和列中查找值? 我无法读取所有的行,因为这样会破坏动态加载的目的

在我的例子中,CSV解析器可以获取CSV[row][column]这样的值。当查看源代码时,我注意到它在文件中的所有内容上循环,直到到达正确的索引列对为止。要获取第100000行第80列的值,可能需要相当长的时间


非常感谢您的帮助。

CSV文件不支持在特定行所在的位置建立索引,不支持

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

如果您使用我在本文中介绍的CSV解析器,您一次只能读取一行


另一个选项是,如果要访问同一文件中的多行。在本例中,您可以运行该文件并构建索引列表。但是,只有在一次会话中查找多行时,这才有回报。

好的,您可以快速进行第一次遍历并存储每行的偏移量。这将使后续定位行的速度大大加快。如果您有80列,但有100K行,我将重点关注快速行查找,而不是快速列查找

埃塔:好的,我假设你的CSV文件在磁盘上,你可以独占访问它。其中一些代码是基于

最后,您将看到列表变量offset,它按行号索引,并包含到每一行的偏移量。然后,在进行网格构建时读取文件时,可以使用偏移量[n]来获取要查找的偏移量,我假设您使用的是FileStream或StreamReader,并使用偏移量[n+1]-偏移量[n]来获取长度


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

如果允许您使用第三方库,我会看看其中的一些。MySQL支持CSV引擎,因此,您似乎可以使用他们提供的库来实现这一点

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


如果我能为它们编制索引,我会怎么做?还有,我怎么说给我这个索引的行?是不是每一行都有相同的字节长度,因此我说第18行给我sizeofrow*18,然后我怎么说从该字节长度开始并读取该行?@EvilWeebl我将用一些建议填写我的答案。这看起来很棒!非常感谢,我一定会玩一玩。目前,我在网格中使用未绑定的列并在请求时获取列和行的值时,一个接一个地获取实际值,我知道这不是很有效。当它请求第10行第5列时还不错,因为它只读取那么远的数据,但如果您在第10000行中查找所有6列数据值,这意味着它每次需要读取10000行,以获得一个您可以想象的缓慢的值。
   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
    }