我试图从github获取以下代码的示例,这些代码对我的Linux / Ubuntu安装来说似乎是一个死机。我一直在尝试使用" mechanize"从我的公司内部网抓取数据。见stack question for details。由于我没有足够的智能来解决我的登录问题,我想我会尝试从excel表中提取数据作为解决方法直到我能够找出机械化路线。再一次,我不够聪明,无法让所提供的代码在Linux上运行,因为我收到以下错误:
`kqueue =':此平台不支持kqueue(EventMachine :: Unsupported)
如果我从原始来源提供的信息中正确理解,问题是Linux中不支持kqueue
。 OP声明inotify
是另一种选择,但我没有找到使用它在小部件中显示Excel的类似示例。
以下是GitHub上显示的代码,并希望帮助将其转换为在Linux上运行:
require 'roo'
EM.kqueue = EM.kqueue?
file_path = "#{Dir.pwd}/spreadsheet.xls"
def fetch_spreadsheet_data(path)
s = Roo::Excel.new(path)
send_event('valuation', { current: s.cell(1, 2) })
end
module Handler
def file_modified
fetch_spreadsheet_data(path)
end
end
fetch_spreadsheet_data(file_path)
EM.next_tick do
EM.watch_file(file_path, Handler)
end
答案 0 :(得分:0)
好的,所以我能够通过以下方式让这个工作并在Dashing Dashboard小部件上显示我的数据:
首先:我将 spreadsheet.xls 上传到我的信息中心的根目录。
第二:我将 /jobs/sample.rb 代码替换为:
#!/usr/bin/env ruby
require 'roo'
SCHEDULER.every '2s' do
file_path = "#{Dir.pwd}/spreadsheet.xls"
def fetch_spreadsheet_data(path)
s = Roo::Excel.new(path)
send_event('valuation', { current: s.cell('B',49) })
end
module Handler
def file_modified
fetch_spreadsheet_data(path)
end
end
fetch_spreadsheet_data(file_path)
end
第三:确保 / widgets / number 位于您的信息中心"这是示例安装的一部分"。
第四:将以下代码添加到 /dashboards/sample.erb 文件&#34;这也是示例安装的一部分&#34;。< / p>
<li data-row="1" data-col="1" data-sizex="1" data-sizey="1">
<div data-id="valuation" data-view="Number" data-title="Current Valuation" data-prefix="$"></div>
</li>
我使用this source来帮助我更好地了解Roo的工作原理。我通过更改我的值并重新上传spreadsheet.xls到服务器并在我的仪表板上看到即时更改来测试我的小部件。
希望这有助于某人和我仍在寻找帮助,通过抓取数据来自动完成此过程。参考this if you can help。
答案 1 :(得分:0)
感谢您分享此代码示例。我没有设法让它在我的环境中工作(Raspberry / Raspbian),但经过一些努力,我设法找到了一些有用的东西 - 至少对我而言;)
本周之前我从未使用过Ruby,所以这段代码可能有点糟糕。请接受道歉。
- Christophe
require 'roo'
require 'rubygems'
require 'rb-inotify'
# Implement INotify::Notifier.watch as described here:
# https://www.go4expert.com/articles/track-file-changes-ruby-inotify-t30264/
file_path = "#{Dir.pwd}/datasheet.csv"
def fetch_spreadsheet_data(path)
s = Roo::CSV.new(path)
send_event('csvdata', { value: s.cell(1, 1) })
end
SCHEDULER.every '5s' do
notifier = INotify::Notifier.new
notifier.watch(file_path, :modify) do |event|
event.flags.each do |flag|
## convert to string
flag = flag.to_s
puts case flag
when 'modify' then fetch_spreadsheet_data(file_path)
end
end
end
## loop, wait for events from inotify
notifier.process
end