我正在寻找一种允许我从浏览器(通过URL)下载CSV文件的实现,我可以手动打开该文件并以CSV格式查看其内容。
我一直在做一些研究,可以看到我应该使用IO,CSV或File类。
我的网址类似于:
"https://mydomain/manage/reporting/index?who=user&users=0&teams=0&datasetName=0&startDate=2015-10-18&endDate=2015-11-17&format=csv"
据我所知,我有:
href = page.find('#csv-download > a')['href']
csv_path = "https://mydomain/manage/reporting/index?who=user&users=0&teams=0&datasetName=0&startDate=2015-10-18&endDate=2015-11-17&format=csv"
require 'open-uri'
download = open(csv_path, ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE)
IO.copy_stream(download, 'test.csv')
这实际上输出:
2684
这告诉我,我已成功获取数据?
下载文件时,内容只是
#<StringIO:0x00000003e07d30>
这有什么理由吗?
这是从哪里开始的,有人能指出我正确的方向吗?
答案 0 :(得分:2)
这应该从远程读取,写入然后解析文件:
require 'open-uri'
require 'csv'
url = "https://mydomain/manage/reporting/index?who=user&users=0&teams=0&datasetName=0&startDate=2015-10-18&endDate=2015-11-17&format=csv"
download = open(url)
IO.copy_stream(download, 'test.csv')
CSV.new(download).each do |l|
puts l
end
答案 1 :(得分:0)
如果您只想读取文件并保存,那很简单。这个未经测试的代码应该是所需的全部代码:
require 'open-uri'
CSV_PATH = "https://mydomain/manage/reporting/index?who=user&users=0&teams=0&datasetName=0&startDate=2015-10-18&endDate=2015-11-17&format=csv"
IO.copy_stream(
open(
CSV_PATH,
ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE
),
'test.csv'
)
OpenURI的open
返回一个IO流,这是让copy_stream
满意所需的全部内容。
通常,您会看到open
,read
,write
模式。 open
将为远程文档创建IO流,read
将检索远程文档,write
将其输出到本地磁盘上的文本文件。有关详细信息,请参阅其文档。
require 'open-uri'
CSV_PATH = "https://mydomain/manage/reporting/index?who=user&users=0&teams=0&datasetName=0&startDate=2015-10-18&endDate=2015-11-17&format=csv"
File.write(
'test.csv',
open(
CSV_PATH,
ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE
).read
)
对于可能不适合内存的大型文件,使用copy_stream
可能具有可伸缩性优势。这对用户来说是一种考验。