【问题标题】:Parse remote file with FasterCSV使用 FasterCSV 解析远程文件
【发布时间】:2012-08-04 02:32:09
【问题描述】:

我正在尝试解析远程 CSV 文件的前 5 行。但是,当我这样做时,它会引发Errno::ENOENT 异常,并说:

No such file or directory - [file contents]([文件内容] 是 CSV 内容的转储

这是我的代码:

  def preview
    @csv = []
    open('http://example.com/spreadsheet.csv') do |file|
      CSV.foreach(file.read, :headers => true) do |row|
        n += 1
        @csv << row
        if n == 5
          return @csv
        end
      end
    end
  end

上面的代码是根据我看到其他人在 Stack Overflow 上使用的代码构建的,但我无法让它工作。

如果我从文件中删除 read 方法,它会引发 TypeError 异常,说:

can't convert StringIO into String

我有什么遗漏吗?

【问题讨论】:

  • 也许我没有意识到这一点,但据我所知,FasterCSV 无法即时下载文档并对其进行解析 - 请先将其保存到您的硬盘中

标签: ruby parsing csv import fastercsv


【解决方案1】:

Foreach 需要一个文件名。试试 parse.each

【讨论】:

  • 谢谢 - 虽然当我尝试 foreach 时(这似乎更优雅,因为我想加载一个文件),我收到以下错误:No such file or directory - http://example.com/spreadsheet.csv 有没有更好的方法来写这个?
  • 我想您可以先将网址保存为文件。
  • 我意识到这有点离题了,但我正在使用载波将这些文件保存在 s3 中。通过载波对象也不起作用 - 我应该采取不同的策略吗?使用heroku,所以我无法将文件下载到我的服务器。
  • 在这种情况下使用 parse.each,无论如何我并不认为它不那么优雅。
【解决方案2】:

您可以手动将每一行传递给 CSV 进行解析:

require 'open-uri'
require 'csv'

def preview(file_url)
    @csv = []
    open(file_url).each_with_index do |line, i|
        next if i == 0 #Ignore headers
        @csv << CSV.parse(line)
        if i == 5
            return @csv
        end
    end
end

puts preview('http://www.ferc.gov/docs-filing/eqr/soft-tools/sample-csv/contract.txt')

【讨论】:

    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多