我一次抓取一个值并将其动态加载到网格中。
有没有办法索引 csv 文件以仅查找特定行和列的值?我无法读取所有行,因为这会破坏动态加载的目的。
CSV 解析器,在我的例子中是Fast CSV Parser,可以获取这样的值csv[row][column]
。查看源代码时,我注意到它会遍历文件中的所有内容,直到到达正确的索引列对。要获取第 100,000 行第 80 列的值,可能需要相当长的时间。
非常感谢任何帮助。
我一次抓取一个值并将其动态加载到网格中。
有没有办法索引 csv 文件以仅查找特定行和列的值?我无法读取所有行,因为这会破坏动态加载的目的。
CSV 解析器,在我的例子中是Fast CSV Parser,可以获取这样的值csv[row][column]
。查看源代码时,我注意到它会遍历文件中的所有内容,直到到达正确的索引列对。要获取第 100,000 行第 80 列的值,可能需要相当长的时间。
非常感谢任何帮助。
CSV 文件不支持对特定行可能存在的位置进行索引,不。
我认为你能做的最好的事情就是阅读每一行,直到找到你想要的那一行。因此,在扫描一行时,您将平均读取一半文件,这比读取整个文件要好。
如果您使用我在用 C# 读取和写入 CSV 文件一文中介绍的 CSV 解析器,您一次只能读取一行。
另一种选择是,如果您要从同一个文件访问多行。在这种情况下,您可以遍历文件并构建索引列表。但这只有在您要在单个会话中查找多行时才会得到回报。
好吧,你可以做一个快速的第一遍并存储每一行的偏移量。这将使随后定位一行更快。如果您有 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 库对此具有良好的逻辑。
如果您被允许使用 3rd 方库,我会看看其中的一些。MySQL 支持 CSV 引擎,因此您似乎可以使用它们提供的库来执行此操作。
然而,C# 并没有提供处理 CSV 文件的好方法。
http://dev.mysql.com/doc/refman/5.0/en/csv-storage-engine.html