将文件数据读入数组:Ruby

时间:2012-02-18 06:30:00

标签: ruby arrays loops

全部,
我有一个包含2列的csv文件。我必须根据这些数据绘制图表。 Column1(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

这段代码出了什么问题?

2 个答案:

答案 0 :(得分:3)

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

我会使用类似以下的内容:

#!/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...

当您绘制点数时,顺序无关紧要,因为无论如何它们都会在图表上的正确位置结束。

答案 1 :(得分:1)

正如已经提到的:哈希没有订购(至少在红宝石1.8中)。

Ruby 1.9已经订购了哈希值,因此升级可能对序列有所帮助。

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

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

另一个问题:您是否检查了csv_data的内容?

当我使用您的程序和数据时,我得到{"1 95"=>"1 95", "2 95"=>"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