【问题标题】:Working with large csv files处理大型 csv 文件
【发布时间】:2015-02-20 03:51:39
【问题描述】:

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

【问题讨论】:

  • 在不同线程上以25%的块逐行打开需要读取的部分
  • 也许您可以考虑运行一个后台服务来将您的 CSV 文件移动到数据库。然后就可以轻松进行 SQL 查询了
  • 要求不明确,也许你只需要第一个CSV的一行来做查询,如果是这样的话,StreamReader.ReadLine()就足够了。如果您确实需要 100 万行中的所有键来执行查询,那么您没有更好的选择。
  • 是什么让您认为将数据复制到数据库中效率低下?数据库不仅仅是一种存储机制。它也有索引……这是一种常见的优化,将数据复制成易于阅读的形式……哎呀,我们甚至在现实生活中通过书籍和互联网来做到这一点……
  • 除非您正在执行随机查询的 CSV 文件真的很大,否则我建议将其保存在存储中。 KISS 原则。作为替代方案,如何读取它并记下文件中的键和偏移量,以便在需要时读取各个行。

标签: c# .net csv


【解决方案1】:

您可以尝试OleDb,使用数据适配器将数据加载到数据表中,并对其进行查询。这个link已经解释了

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);

【讨论】:

  • Answer 没有考虑到 OP 对 RAM 使用的担忧。
  • @Suresh 将其加载到内存中并不是一个真正的选择。这些文件可能有 1-2 百万行和 30 列。看来我最好的选择是即时将它们放入数据库。
  • 我明白,是的,在这种情况下,上述解决方案将不起作用。
猜你喜欢
  • 2015-10-10
  • 2018-02-23
  • 2017-07-05
  • 2014-08-12
  • 2014-09-24
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多