【问题标题】:Read file data into array : Ruby将文件数据读入数组:Ruby
【发布时间】:2012-02-18 06:29:59
【问题描述】:

全部,
我有一个包含 2 列的 csv 文件。我必须根据这些数据绘制图表。第 1 列(X 轴)是简单的递增数字,第 2 列具有随机正整数(Y 轴)。示例数据如下所示

1 95
2 95
3 95
4 85
5 81
6 81
7 84
8 92
9 85

我必须读取文件的内容并将其显示在图表中。我是 Ruby 的绝对新手。这是我正在处理的代码(不是我的):

data = []
fields = []
csv_data = {}

File.open(CSV_FILENAME, "r").each_line do |line|
  line = line.strip.split(',')
  csv_data[line.first.to_s] = line.last
end

csv_data.each do |row|
    content = row.first
  log "Creating data point: #{content}"

  fields << content
  data << row.last.to_i


end

我在终端看到的输出完全不同。这是我看到的输出:
创建数据点:6
创建数据点:7
创建数据点:8
创建数据点:9
创建数据点:1
创建数据点:2
等等。

因此图表也不正确。我希望输出采用这种形式:
创建数据点:1
创建数据点:2
创建数据点:3
等等

这段代码有什么问题?

【问题讨论】:

    标签: ruby arrays loops


    【解决方案1】:

    哈希(由{} 标识)不是有序的数据结构。如果你想要一个有序列表,你需要使用一个数组。

    我会使用类似以下的东西:

    #!/usr/bin/env ruby
    
    filename = 'test.csv'
    graph_data = {}
    
    File.open(filename, 'r').each_line do |line|
      line = line.strip.split ','
      graph_data[line.first.to_s] = line.last.to_s
    end
    
    graph_data.each_pair do |x,y|
      puts "#{x} => #{y}"
    end
    
    # Graph your data points here...
    

    当您绘制点时,顺序无关紧要,因为无论如何它们最终都会出现在绘图上的正确位置。

    【讨论】:

    【解决方案2】:

    如前所述:哈希没有顺序(至少在 ruby​​ 1.8 中)。

    Ruby 1.9 已对哈希排序,因此升级可能有助于排序。

    或者使用 ruby​​ 1.8,您可以更改为数组(请参阅其他答案)或我的建议:对哈希进行排序:

    csv_data.sort.each do |row|
      #...
    

    另一个问题:你检查csv_data的内容了吗?

    当我使用你的程序和数据时,我得到{"1 95"=&gt;"1 95", "2 95"=&gt;"2 95", ...。我认为。这不是你想要的结果。

    您创建了一个split(','),但您显示的数据是空格分隔的,所以我会使用split(' ')

    当您这样做时,csv_data 包含数据,您不需要变量 datafields

    下面的MWE用DATA替换文件,但说明了原理:

    csv_data = {}
    
    #~ File.open(CSV_FILENAME, "r").each_line do |line|
    DATA.each_line do |line|
      line = line.strip.split(' ')
      csv_data[line.first.to_s] = line.last.to_i
    end
    #check the data
    #~ p csv_data
    
    csv_data.sort.each do |row, col|
      puts "Point: #{row} - #{col}"
    end
    
    #If 
    fields = csv_data.keys
    data  = csv_data.values
    
    __END__
    1 95
    2 95
    3 95
    4 85
    5 81
    6 81
    7 84
    8 92
    9 85
    

    【讨论】:

      猜你喜欢
      • 2012-12-05
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 2013-04-01
      相关资源
      最近更新 更多