【问题标题】:I would like to parse csv by ruby to create a report我想通过 ruby​​ 解析 csv 来创建报告
【发布时间】:2017-03-31 21:23:16
【问题描述】:

我有一个 csv 报告,其中有两行标题为“日期”和“客户名称”:

["Date", "Customer_Name"]
["Monday", "John"]
["", "David"]
["", "Sam"]
["", "Kenny"]
["Tuesday", "Mary"]
["", "Jade"]
["", "Lindsay"]
["Wednesday", "Tom"]
["", "Lindon"]
["", "Peter"]

我正在尝试打印一份声明以显示当天的客户是谁,因此它会显示如下:星期一有客户 John、David、Sam 和 Kenny。 \n 星期二有 Mary、Jade 和 Lindsay

我的代码是:

require 'csv'

col_date = []
col_name = []
custDate = CSV.foreach("customerVisit.csv") {|row| col_date << row[0]}
customer_name = CSV.foreach("customerVisit.csv") {|row| col_name << row[1]}

print "#{col_date} has customers #{col_name} visited the store."

但我没有得到正确的输出,很可能我是编程新手。请帮助我应该如何实现要求?

["Date", "Monday", nil, nil, nil, "Tuesday", nil, nil, "Wednesday", nil, nil] 有客户 ["Customer_Name", "John", "David", " Sam”、“Kenny”、“Mary”、“Jade”、“Lindsay”、“Tom”、“Lindon”、“Peter”] 参观了商店。C02S51D2G8WL:RubySQL

问候

【问题讨论】:

  • 输入文本是否真的有这样的大括号?
  • 不,我只是通过读取 csv 文件来获取该输出。 # 要求 'csv' # CSV.foreach ('customerVisit.csv') 做 |row| # puts row.inspect # end "Date", "Customer_Name" "Monday", "John" "", "David" "", "Sam" "", "Kenny" "Tuesday", "Mary" "", "翡翠""""林赛""星期三""汤姆""""林登""""彼得"
  • 或者如果我的要求有更好的解决方案,请告知。但请记住,每天都会有不同的客户出现,所以不会总是只有 3 或 4 个客户。

标签: ruby csv spreadsheet roo-gem rubyxl


【解决方案1】:

您的结果的原因可以在这里找到“#{array}”,它将数组“按原样”插入到字符串中。因此,您可以分块获得每个集合。

我怀疑您使用了错误的工具来完成这项工作。 ruby 哈希更适合对数据进行分类。 (至少这次)

例如

require 'csv'
customer_hash = {} # {"Date" => "Customers"}

temp = ""
CSV.foreach("customerVisit.csv") { |date, customer|
    temp = date if date
    customer_hash[temp] = [] unless customer_hash[temp]
    customer_hash[temp] << customer
}

customer_hash.each { |date, customers|
    print "#{date} has customers"
    customers.each { |name| print ", #{name}" }
    print "\nvisiting the store.\n"
}

这应该在他们关联的那一天之后输出所有客户。

我不在家,无法运行它,我希望它能按预期工作 >_

已编辑代码,因为您误读了您的数据样本。

【讨论】:

  • 谢谢!这行得通!但我有一个问题。 temp = date if date 基本上意味着如果日期匹配,那么它将继续循环查找 customer_name 直到它有一个正确的新日期?
  • 是的,不是的,不完全是它的作用,但它具有那种效果。在您的输出中,您的值为零,直到新的一天到来。因此,除非 date 为 nil,否则该行会将 temp = 设置为日期。
猜你喜欢
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多