В чем ошибка в этих двух строках кода? Получение шаблона: "http: // blabla .nc" - PullRequest
0 голосов
/ 08 октября 2019

У меня есть сотни TXT-файлов, которые содержат много вещей и некоторые ссылки для скачивания.

Шаблон ссылок для скачивания такой:

начинаются с: http://

и

оканчиваются на: .nc

Для вашего удобства я создал образец текстового файла, который вы можете скачать по этой ссылке:

https://www.dropbox.com/s/5crmleli2ppa1rm/textfile_including_https.txt?dl=1

Исходя из этой темы в Stackoverflow, я попытался извлечь все ссылки для скачивания из текстового файла:

Извлечь ссылки веб-сайтов из текста в R

Вот мой код:

download_links <- readLines(file.choose())
All_my_links <- gsub(download_links, pattern=".*(http://.*nc).*", replace="\\1")

Но он также возвращает все строки, , пока я хочу извлечь только http ссылки, оканчивающиеся на .nc

Вот результат:

head(All_my_links )
tail(All_my_links )

> head(All_my_links )

[1] "#!/bin/bash"                                                                                                                                                                              
[2] "##############################################################################"                                                                                                           
[3] "version=1.3.2"                                                                                                                                                                            
[4] "CACHE_FILE=.$(basename $0).status"                                                                                                                                                        
[5] "openId="                                                                                                                                                                                  
[6] "search_url='https://esgf-node.llnl.gov/esg-search/wget/?distrib=false&dataset_id=CMIP6.HighResMIP.MIROC.NICAM16-9S.highresSST-present.r1i1p1f1.day.pr.gr.v20190830|esgf-data2.diasjp.net'"

> tail(All_my_links )

[1] "MYPROXY_STATUS=$HOME/.MyProxyLogon"                                 
[2] "COOKIE_JAR=$ESG_HOME/cookies"                                       
[3] "MYPROXY_GETCERT=$ESG_HOME/getcert.jar"                              
[4] "CERT_EXPIRATION_WARNING=$((60 * 60 * 8))   #Eight hour (in seconds)"
[5] ""                                                                   
[6] "WGET_TRUSTED_CERTIFICATES=$ESG_HOME/certificates"   

В чем моя ошибка в коде?

Любой комментарий будет высоко оценен.

1 Ответ

2 голосов
/ 08 октября 2019

gsub() не для извлечения, вот что не так с вашим кодом. Это для замены. (См. help("gsub")). Для этой демонстрации я буду использовать следующие данные:

x <- c("abc", "123", "http://site.nc")

(я, как правило, не буду загружать данные, размещенные здесь в качестве ссылки. Большинство других также не будут. Если вы хотите,чтобы поделиться примерами данных, лучше всего сделать это, включив в свой вопрос вывод dput()).

Давайте посмотрим, что происходит с вашим подходом gsub():

gsub(pattern = ".*(http://.*nc).*", replacement = "\\1", x = x)
# [1] "abc"            "123"            "http://site.nc"

Looksзнакомый. Здесь происходит то, что gsub() просматривает каждый элемент x и заменяет каждое вхождение pattern на replacement, которое в данном случае само по себе. При таком подходе вы всегда получите обратно тот же самый символьный вектор.

Я бы предложил stringr::str_extract():

stringr::str_extract(string = x, pattern = ".*http://.*nc.*")
# [1] NA               NA               "http://site.nc"

Если вы оберните это в na.omit(), это даст вам выводЯ думаю, что вы хотите:

na.omit(stringr::str_extract(string = x, pattern = ".*http://.*nc.*"))
# [1] "http://site.nc"
...