C# 使用大型csv文件

C# 使用大型csv文件,c#,.net,csv,C#,.net,Csv,我正试图找到一些处理大型数据文件的最佳方法。我有一个场景,我将有几个CSV文件,其中我希望能够查询数据。我将逐行读取其中一个csv文件,但我需要能够根据当前读取的行中的键查询第二个csv文件。我不想(至少我不认为)将整个CSV加载到内存对象中,因为它们可能有数百万行,并且会消耗大量RAM。我曾考虑过在运行时将它们写入某种数据库文件,但这似乎并不高效,因为您实际上是在复制数据。有什么建议吗?您可以尝试OleDb,使用数据适配器在数据表中加载数据,并对其执行查询。这就解释了 String conn

我正试图找到一些处理大型数据文件的最佳方法。我有一个场景,我将有几个CSV文件,其中我希望能够查询数据。我将逐行读取其中一个csv文件,但我需要能够根据当前读取的行中的键查询第二个csv文件。我不想(至少我不认为)将整个CSV加载到内存对象中,因为它们可能有数百万行,并且会消耗大量RAM。我曾考虑过在运行时将它们写入某种数据库文件,但这似乎并不高效,因为您实际上是在复制数据。有什么建议吗?

您可以尝试OleDb,使用数据适配器在数据表中加载数据,并对其执行查询。这就解释了

String conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\;
    Extended Properties=""Text;HDR=No;FMT=Delimited""";

OleDbConnection cn = new OleDbConnection(conn);
OleDbCommand cmd = new OleDbCommand(@"SELECT * FROM C:\Temp\teams.csv", cn);
OleDbDataAdapter da = new OleDbDataAdapter(cmd);

cn.Open();

DataTable dt = new DataTable();

da.Fill(dt);

打开需要在25%个块上逐行读取的不同线程,可以考虑一个运行CSV文件到数据库的后台服务。然后您可以轻松地进行SQL查询需求不明确,可能您只需要第一个CSV中的一行来进行查询,如果是这样,
StreamReader.ReadLine()
就足够了。如果您确实需要100万行中的所有键来执行查询,那么您没有更好的选择。是什么让您认为将数据复制到数据库中效率低下?数据库不仅仅是一种存储机制。它也有索引…这是一个常见的优化,将数据复制到一个易于阅读的表单中…见鬼,我们甚至在现实生活中使用书籍和互联网进行此操作…除非您正在进行随机查询的CSV文件非常大,否则我建议将其存储在存储器中。接吻原则。另一种方法是,读取并在文件中记录键和偏移量,这样您就可以在需要时读取单独的行。答案没有考虑OP对RAM使用的关注。@Suresh此时将其加载到内存中并不是一个真正的选项。这些文件可能有100-200万行和30列。看来我最好的办法是在运行时将它们放入数据库。我明白,在这种情况下,上述解决方案是行不通的。