0

我有一个包含以下数据的 CSV 数据文件:

id,account_number,balance,date
1,ar161429,482.29,11/28/2007 15:54
2,ar182364,266.93,10/9/2007 15:54
3,ar106644,887.78,10/23/2007 15:54

我正在尝试为日期和帐号创建一个数组,然后将日期进一步分解为日、月和年。我能够根据“,”拆分数据并为帐户和日期创建一个数组,但是当我尝试将日期拆分为月份和日期时,它不起作用。这是我的代码:

class Account
 puts "Please Enter the name of account file in .txt format"
 balance_file = gets.chomp

 @number_lines = File.read(balance_file).scan(/\n/).count
 @number_lines = @number_lines - 1


 File.open(balance_file) do |aFile|
   @@balance = []
   @@balance_due = []
   @@balance_due_day = []
   @@balance_due_month =[]
   @@balance_due_year = []

   aFile.each_line do |line|
     @@balance << line.split(",").values_at(2)
     @@balance_due << line.split(",").values_at(3)
     puts @@balance_due

   end


   i = 1
   begin
     @@balance_due_day[i] =  @@balance_due[i].split("/").values_at(0)
     @@balance_due_month[i] = @@balance_due[i].slice!(3,2)

     i +=1
   end    while i<@number_lines
 end
end
4

3 回答 3

1

好吧,很多事情要说:

首先,slice!以 结尾!,因此与大多数 bang 方法一样,它意味着它改变了对象本身,而不是只返回一个新对象。控制台示例:

> a = [1,2,3]
 => [1, 2, 3] 
> a.slice(2,3)
 => [3] 
> a
 => [1, 2, 3] # didn't modified a
> a.slice!(2,3)
 => [3] 
> a
 => [1, 2]  # modified a

其次,不要使用while在列表中循环。只需使用每个(当然您可以使用它doend如果它是多行操作:

[1,2,3].each{|x| p x}
1
2
3

第三,以 double 为前缀的变量@不应该是你想的那样。它们不经常使用。我建议你阅读它。

要查看您的日期提取逻辑出了什么问题,最好打开 ruby​​ 终端(命令为irb)。然后键入一些行,例如

> a_date = a_date.split("/").values_at(0)
 => ["11"] 
> a_date = a_date.slice!(3,2)
 => nil

我没有更正,因为我不是 100% 确定你想要什么作为输出,但我认为你现在可以在这里看到问题。

快乐的黑客

于 2013-09-06T03:08:24.973 回答
1

您应该使用 CSV 和日期:

require 'csv'
require 'date'

date_and_account_number = []

CSV.foreach('data.csv', :headers => true) do |row|
    date_and_account_number << [row[3],row[1]]
end

date_and_account_number.map! {|e|  dt = DateTime.strptime(e[0],"%m/%d/%Y %H:%M"); [dt.day,dt.month,dt.year,e[1]] }

#=> [[28, 11, 2007, "ar161429"], [9, 10, 2007, "ar182364"], [23, 10, 2007, "ar106644"]]
于 2013-09-06T03:14:24.713 回答
0
string = <<_
id,account_number,balance,date
1,ar161429,482.29,11/28/2007 15:54
2,ar182364,266.93,10/9/2007 15:54
3,ar106644,887.78,10/23/2007 15:54
_

string.sub(/^.*$/, "").scan(%r{^[^,]*,([^,]*),[^,]*,([^/]*)/([^/]*)/(\S*)\s+.*$})
# => [
#      ["ar161429", "11", "28", "2007"],
#      ["ar182364", "10", "9", "2007"],
#      ["ar106644", "10", "23", "2007"]
#    ]
于 2013-09-06T04:13:41.347 回答