我一次抓取一个值并动态加载到网格中。
有没有办法将csv文件索引为只查找某个行和列的值? 我无法读取所有行,因为这会破坏动态加载的目的。
我的情况下,CSV解析器Fast CSV Parser可以获取类似csv[row][column]
的值。在查看源代码时,我注意到它遍历文件中的所有内容,直到它到达正确的索引列对。要在第100,000行第80列中获取值,可能需要很长时间。
任何帮助都非常感激。
答案 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