Считать данные файла в массив: Ruby - PullRequest
2 голосов
/ 18 февраля 2012

All
У меня есть CSV-файл с 2 столбцами. Я должен построить график на основе этих данных. Столбец 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
и т.д.

Что не так в этом куске кода?

Ответы [ 2 ]

3 голосов
/ 18 февраля 2012

Хэши (обозначенные {}) не являются упорядоченными структурами данных. Вам нужно использовать массив, если вы хотите упорядоченный список.

Я бы использовал что-то похожее на следующее:

#!/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 голос
/ 18 февраля 2012

Как уже упоминалось: хэши не упорядочены (по крайней мере, в ruby ​​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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...