全部,
我有一个包含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
等
这段代码出了什么问题?
答案 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
包含数据,您不需要变量data
或fields
。
以下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