【问题标题】:How do I filter data from a CSV file in Excel or with Ruby?如何在 Excel 或 Ruby 中过滤来自 CSV 文件的数据?
【发布时间】:2016-12-31 01:32:25
【问题描述】:

我需要分析一个巨大的 CSV 文件(超过 57,000 行和 50 列)。

编辑:大家好,感谢您的回答和 cmets,但我仍然对如何在 Ruby 中执行此操作感到非常困惑,而且我不知道如何使用 MySQL。我将尝试更具体:

CSV 文件:

CSV on Storm Data Details for 2015

CSV on Storm Data Details for 2000

问题: 在问题开始之前,对于所有答案,排除县/教区、区域或海洋名称以字母 A、B 或 C 开头的所有行。

  1. 查找 2015 年华盛顿州发生风暴事件最多的月份。该月有多少天没有暴风雨天气?
  2. 2000 年美国东部标准时间晚上 8 点到早上 8 点之间发生了多少次影响树木的风暴?
  3. 哪一年(2000 年或 2015 年)风暴在 13 个原始殖民地的边界内产生了更高的货币影响?

问题:

1) 我能够使用 Excel 中的过滤器确定华盛顿最“雷暴风”事件发生在 7 月(6 个条目),并且有 27 天没有暴风雨天气。但是,当我尝试在 Spotfire 中检查我的工作时,我得到了完全不同的结果。 (5 月份有 7 个条目,5 月份有 28 天无风暴天气。Excel 仅在 5 月份发现了两次雷暴风事件。)您知道导致这种差异的原因是什么吗?

2) 有两列可能会提到对树木的损害:Event_Narrative 和 Episode_Narrative。是否可以在两列中搜索“树”并将电子表格过滤到仅这些结果?在 Excel 中,多列过滤显然是不可能的。我还需要找到一种方法在结果中省略“street”一词(因为它包含“tree”一词)。

我想出的时间范围的方法是仅过滤到 EST 和 AST 结果,然后将 Begin_Time 过滤到 2000 到 2359 和 0 到 759 并重复这些范围以过滤 End_Time。这似乎有效。

3) 我能够将州筛选为特拉华州、宾夕法尼亚州、新泽西州、乔治亚州、康涅狄格州、马萨诸塞州、马里兰州、南卡罗来纳州、新罕布什尔州、弗吉尼亚州、纽约州、北卡罗来纳州和罗德岛州。将 Y 列和 Z 列(Damage_Property,Damage_Crops)中的所有值相加并在两年之间进行比较似乎是一项简单的任务,但是这些值是以“32.79K”的形式编写的,我不知道如何进行添加方程以该格式工作或将值转换为整数。

另外,问题是要问殖民地的原始领土,这与那些国家现在占领的领土不同。您知道解决此问题的方法吗?就算有时间查了每一个列出的城市,网上好像也没有原来13个殖民地城市的数据库,就算有,现在城市的名字也可能不一样了。


我正在学习 Ruby,有人建议我尝试使用 Ruby CSV 库将数据放入数组中。我看过一些描述如何做到这一点的教程,但我仍然不明白如何将数据过滤到我需要的数据。

谁能帮忙?

谢谢!

【问题讨论】:

  • 您是否考虑将数据加载到数据库中?感觉 SQL 可能是比 Ruby 和大数组更好的选择。
  • 向我们展示你的尝试。
  • 为什么只能在 Excel 中筛选一件事?你有一些限制版本的 Excel 吗?

标签: ruby excel csv filtering spreadsheet


【解决方案1】:

想将此作为评论发布,但我没有足够的代表。总之:

我过去在一些 nodejs 包的帮助下将 CSV/xls 文件转换为 JSON,并将它们上传到我的 couchbase 数据库。在 couchbase 中,我可以使用 N1ql(实际上只是 SQL)进行查询,这将允许您实现过滤多个条件的目标。就像 spickermann 说的,数据库会解决你的问题。

编辑: My-Sql 还支持将 CSV 文件导入 My-SQL 表。将比 CSV 到 JSON 到 Couchbase 更容易

CSV 到 json https://github.com/cparker15/csv-to-json/blob/master/README.md

【讨论】:

    【解决方案2】:

    我下载了数据,以便可以使用它。您可以在 Ruby 中轻松获得记录数。我只是在 irb 中完成的:

    require 'csv'
    
    details = []
    CSV.foreach("StormEvents_details-ftp_v1.0_d2015_c20160818.csv") do |row|
      details << row
    end
    
    results = details.select do |field|
      [field[-2], field[-3]].any? { |el| el[/\btree\b/i] } && field[8] == "CALIFORNIA"
    end
    
    results.count
     => 125
    

    我刚刚使用了数组索引。您可以将内容压缩在一起并制作散列以提高可读性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 2019-08-03
      • 2018-05-17
      • 1970-01-01
      相关资源
      最近更新 更多