保存并解析来自网址

时间:2015-11-17 16:20:20

标签: ruby csv

我正在寻找一种允许我从浏览器(通过URL)下载CSV文件的实现,我可以手动打开该文件并以CSV格式查看其内容。

我一直在做一些研究,可以看到我应该使用IOCSVFile类。

我的网址类似于:

"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>

这有什么理由吗?

这是从哪里开始的,有人能指出我正确的方向吗?

2 个答案:

答案 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满意所需的全部内容。

通常,您会看到openreadwrite模式。 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可能具有可伸缩性优势。这对用户来说是一种考验。