R: прочитать имя файла или листа csv-файла - PullRequest
0 голосов
/ 03 августа 2020

Есть ли возможность прочитать имя файла или имя листа файла .csv при его импорте в R? Я создал .csv, щелкнув URL-адрес: https://www.populationpyramid.net/api/pp/4/2019/?csv=true

Файл имеет имя «Афганистан-2019» и имя листа такое же. Теперь я попытался сделать то же самое с R, используя

library(readr)
df <- read_csv("https://www.populationpyramid.net/api/pp/4/2019/?csv=true")

Однако это дает мне доступ только к данным, но я потерял информацию об имени файла / листа. Есть предложения?

1 Ответ

1 голос
/ 03 августа 2020

Вы можете использовать функцию excel_sheets из пакета readxl, чтобы получить вектор символов всех листов, содержащихся в файле excel.

Изменить:

Извините, теперь я понял, что вы загружаете файл CSV. Файлы CSV представляют собой плоские файлы и поэтому не имеют имен листов, поэтому единственный вариант - это имя файла. Поскольку вы, по сути, запрашиваете API, вы можете использовать пакет httr вместо этого для отправки запроса GET:

library(httr)
library(stringr)

res <- httr::GET("https://www.populationpyramid.net/api/pp/4/2019/?csv=true")

Это дает вам объект response, который содержит всю интересную информацию - включая фактические данные (да) и имя файла.

Вы можете получить данные с помощью функции content:

httr::content(res)

#> # A tibble: 21 x 3
#>    Age         M       F
#>    <chr>   <dbl>   <dbl>
#>  1 0-4   2891330 2747452
#>  2 5-9   2765393 2636519
#>  3 10-14 2614937 2501560
#>  4 15-19 2321520 2197654
#>  5 20-24 1950650 1843985
#>  6 25-29 1551332 1433056
#>  7 30-34 1255855 1138037
#>  8 35-39 1033269  954327
#>  9 40-44  834402  758533
#> 10 45-49  649695  603870
#> # … with 11 more rows

Чтобы получить файл name, нам нужно проявить немного больше творчества. Имя файла хранится в элементе content-disposition в разделе headers объекта res:

res$headers$`content-disposition`
#> [1] "attachment; filename=Afghanistan-2019.csv"

Мы можем извлечь его с помощью регулярного выражения, которое вытягивает весь текст после первого =:

stringr::str_extract(res$headers$`content-disposition`, "(?<=\\=).*")

# [1] "Afghanistan-2019.csv"

Поскольку response объекты всегда должны содержать одну и ту же информацию в одних и тех же местах (особенно при получении из одного и того же API), вы можете легко автоматизировать этот процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...