【问题标题】:Fastest way to search through a CSV and return specific array of values (Ruby)搜索 CSV 并返回特定值数组的最快方法(Ruby)
【发布时间】:2017-06-23 21:05:11
【问题描述】:

基本上,我想通过我读入的 CSV 进行搜索。它将作为数组数组读入。我只想提取行的第一个元素等于某个值的行。如果这是真的,我想然后将行作为一个单元提取并将其添加到数组中以进行进一步的数据处理。

现在,我正在使用

CSV.foreach(filepath) do |row|
  if (row[0] == experiment)
    exp1 = true && (row[0] == experiment) && row[7] == data)
    if exp1
      exp1_array.push(row)
    end
  end
end

目前发生的情况是它太慢了,因为 CSV 是一个巨大的文件。我想知道是否有人有一种非常快速的方法来读取 CSV、检查条件并在条件为真时添加到特定数组。

另外,如果第一行是experiment1的名称,我需要添加到exp1_array,如果第一行是experiment2的名称,我需要添加到exp2_array,这就是第一个if条件检查存在的原因。

如果有人可以帮助我将非常感激!

【问题讨论】:

  • 大文件会很慢。不过,定义“巨大”并定义“慢”。这里没有繁重的计算,所以没有简单的方法来解决这个问题。也许您可以以某种方式预先过滤您的 CSV 文件?
  • 什么是experiment?是变量还是方法调用?
  • 是的,我想我正在寻找预过滤我的 CSV,只是想知道一些可以帮助我这样做的方法?
  • 实验是变量,我要匹配的字符串的名字
  • @engineersmnky :是的,MongoDB is web-scale ;)

标签: arrays ruby csv


【解决方案1】:

如果您想避免使用 cmets 中建议的 NoSQL 数据库,您可以通过避免重复检查来加快速度。

老实说,这听起来更像是一个家庭作业问题而不是工程问题,所以我认为 NoSQL 不合适。

以下是您加快速度的方法。

如果循环太复杂并且包含一些不必要的检查。 True 始终为 true,因此没有理由检查它是否为 true。

  if (row[0] == experiment)
    exp1 = (row[0] == experiment) && row[7] == data)
    if exp1
      exp1_array.push(row)
    end
  end

您正在检查row[0] 两次以获得相同的条件。当您删除它时,您会得到:

  if (row[0] == experiment)
    exp1 = (row[7] == data)
    if exp1
      exp1_array.push(row)
    end
  end

这可以进一步简化为

  if (row[0] == experiment)
    if row[7] == data
      exp1_array.push(row)
    end
  end

这个变成了

  if row[0] == experiment && row[7] == data
      exp1_array.push(row)
  end

或将其设为单线

  exp1_array.push(row) if row[0] == experiment && row[7] == data

最终结果是

CSV.foreach(filepath) do |row|
  exp1_array.push(row) if row[0] == experiment && row[7] == data
end

这会更快,因为当重复足够多的次数时,将每个字符串与实验进行两次比较并不便宜。

现在您可以使用选择功能来选择您需要的行。这可能会显着加快速度,因为(我假设)select 是用 C 语言编写的,因此速度非常快。

exp1_array = CSV.foreach(filepath)
  .select { |row| row[0] == experiment && row[7] == data }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2018-10-10
    • 2012-01-15
    相关资源
    最近更新 更多