Как скачать файл Github Raw CSV, используя Ruby - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь получить обновленный файл CSV, COVID-19 , который размещен на GitHub, но я получаю сообщение об ошибке, что его там нет. Это файл, который постоянно обновляется, поэтому я хочу взять его у источника - GitHub.
COVID-19 Time Series - третий элемент на странице.

Я пытался URL необработанного файла, URL страницы CSV и GitHub постоянно говорят мне, что «такого файла или каталога нет».

Вот мой код:

require 'open-uri'
require 'csv'

covids = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv"

puts File.exist?(covids)
keys = CSV.open(covids, &:readline)

Как я могу сослаться на этот файл? Я знаю, что вошел в систему, но Ruby должен видеть эти пути к файлам.

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Выбранный ответ имеет некоторые проблемы:

  • OpenURI open устарело. Вместо этого используйте URI.open:

    pry(main)> open(covids)
    (pry):9: warning: calling URI.open via Kernel#open is deprecated, call URI.open directly or use URI#open
    
  • CSV.open, в то время как это работает, противоречит сигнатуре метода, который хочет имя файла, а не объект ввода-вывода. Вполне возможно, что если в дальнейшем исправить это поведение, использование CSV.open для продолжения ввода объекта ввода-вывода прекратится.

    Вместо этого в первом примере документации CSV *1017* рекомендуется:

    csv = CSV.new(string_or_io, **options)
    
    # Reading: IO object should be open for read
    csv.read # => array of rows
    # or
    csv.each do |row|
      # ...
    end
    
    ...
    

    foreach - это форма each, которую я бы использовал, потому что она лучше подходит моему мозгу, YMMV:

    CSV.foreach(URI.open(covids)) 
    

    в качестве отправной точки. Вот пример просмотра первой записи в файле:

    require 'open-uri'
    require 'csv'
    
    covids = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv"
    
    CSV.foreach(URI.open(covids)).first
    # => ["Province/State",
    #     "Country/Region",
    #     "Lat",
    #     "Long",
    #     "1/22/20",
    #     "1/23/20",
    #     "1/24/20",
    #     "1/25/20",
    #     "1/26/20",
    #     "1/27/20",
    #     "1/28/20",
    #     "1/29/20",
    #     "1/30/20",
    #     "1/31/20",
    #     "2/1/20",
    #     "2/2/20",
    #     "2/3/20",
    #     "2/4/20",
    #     "2/5/20",
    #     "2/6/20",
    #     "2/7/20",
    #     "2/8/20",
    #     "2/9/20",
    #     "2/10/20",
    #     "2/11/20",
    #     "2/12/20",
    #     "2/13/20",
    #     "2/14/20",
    #     "2/15/20",
    #     "2/16/20",
    #     "2/17/20",
    #     "2/18/20",
    #     "2/19/20",
    #     "2/20/20",
    #     "2/21/20",
    #     "2/22/20",
    #     "2/23/20",
    #     "2/24/20",
    #     "2/25/20",
    #     "2/26/20",
    #     "2/27/20",
    #     "2/28/20",
    #     "2/29/20",
    #     "3/1/20",
    #     "3/2/20",
    #     "3/3/20",
    #     "3/4/20",
    #     "3/5/20",
    #     "3/6/20",
    #     "3/7/20",
    #     "3/8/20",
    #     "3/9/20",
    #     "3/10/20"]
    
  • Хотя OpenURI удобен, он не самый полнофункциональный из Ruby клиентов HTTP. Я бы порекомендовал работать с чем-то в верхней части 1047 * списка клиентов HTTP .

    Кроме того, тщательно напишите свой код, чтобы не нарушать свою сеть или следовать рекомендациям GitHub по использованию HEAD запросов для проверки последнего обновления файла; Не повторяйте GET (загрузите) файл, который не был обновлен, потому что это просто плохие сетевые манеры.

На этом этапе вы будете готовы проанализировать файл, сохранение информации на диск или ее повторное использование для чего-то другого. Я бы рекомендовал выгрузить его в базу данных для более легкого повторного использования, используя что-то вроде Sequel , что упрощает построение и доступ к схеме и данным записи SQLite в дисковую БД, или PostgreSQL или MySQL для более полнофункциональных DBM.

1 голос
/ 11 марта 2020

URL-адрес не является файлом, поэтому его нельзя открыть с помощью CSV.open и не использовать при вызове File.exist?. Я вижу, вы уже включили open-uri в свой код, поэтому быстрый способ решить эту проблему - загрузить файл с помощью open и передать его CSV.open:

keys = CSV.open(open(covids), &:readline)
puts keys
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...