csv将数据解析为highcharts

时间:2013-11-15 05:43:13

标签: ruby-on-rails ruby-on-rails-3.2

我试图将csv文件解析为一个懒惰的高图表图。

我使用了paperclip来上传csv文件,我在解析数据方面遇到了问题,而且我不确定该怎么做。

csv文件有3列。第2列和第3列是我想要访问的。第2列是日期,第3列是温度。

控制器

   def show
    @soiltemp = Soiltemp.find(params[:id])
    @data = CSV.parse(@soiltemp.csv.path, :headers => true, :encoding => 'ISO-8859-1')
    dates = []
    temps = []
    @data.each do |row|
    dates << row[1]
    temps << row[2]
        end
    @graph = LazyHighCharts::HighChart.new('graph') do |f|
      f.title({ :text=>"Combination chart"})
      f.options[:xAxis][:categories] = dates
      f.series(:type=> 'area', :name=> 'Degree', :data => [temps], :color => '#00463f')  
    end
    @hash = Gmaps4rails.build_markers(@soiltemps) do |soiltemps, marker|
      marker.lat soiltemps.latitude
      marker.lng soiltemps.longitude
      marker.infowindow render_to_string(partial: 'soiltemps/map')
    end

查看

<%= high_chart("chart", @graph) %>
<p><b>Last Updated:</b> <%= @soiltemp.updated_at.strftime("%d %B, %Y") %></p>

<%= link_to 'Back', soiltemps_path %>

1 个答案:

答案 0 :(得分:0)

您似乎需要每列的值数组来提供高图series。您将遍历csv数据的每一行(@data.each),并且块中的每一行本身是csv的每列中的值的数组,但是索引为0。因此,要获得第2列,您需要row[1]

以下是您可以做的事情:

def show
    @soiltemp = Soiltemp.find(params[:id])
    @data = CSV.parse(@soiltemp.csv.path, :headers => true, :encoding => 'ISO-8859-1')

    dates = []
    temperatures = []

    @data.each do |row|
      dates << row[1] # column 2
      temperatures << row[2] # column 3
    end

    @graph = LazyHighCharts::HighChart.new('graph') do |f|
      f.title({ :text=>"Combination chart"})
      # make the csv row headers the graph's categories
      f.options[:xAxis][:categories] = @data.headers
      f.series(:data => dates, ...rest of options)  
      f.series(:data => temperatures, ...rest of options)
    end
    ... rest of code ...
end

您给哪个系列(日期或临时值)取决于您。希望有所帮助。