【问题标题】:How do I split data and split date from a text file?如何从文本文件中拆分数据和拆分日期?
【发布时间】:2013-09-06 02:48:23
【问题描述】:

我有一个包含以下数据的 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

【问题讨论】:

  • 什么版本的 Ruby?有一个 CSV 类可能会使这更容易一些。见ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html。
  • 不要使用@@ 变量,除非您完全知道为什么要使用它们。类变量,如全局变量,有它们的位置,但不明智的使用通常表示不了解它们的用途,并且由于它们被意外更改而导致无法解释的错误/错误的真正问题。

标签: ruby arrays date csv split


【解决方案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 在列表中循环。只需使用每个(当然你可以使用它do 和end,如果它是多行操作:

[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% 确定您想要什么作为输出,但我认为您现在可以在这里看到问题。

黑客愉快

【讨论】:

    【解决方案2】:

    您应该使用 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"]]
    

    【讨论】:

      【解决方案3】:
      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"]
      #    ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-12
        • 2021-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-06
        相关资源
        最近更新 更多