【问题标题】:R loop to extract CSV files from FTPR循环从FTP中提取CSV文件
【发布时间】:2020-03-09 12:57:58
【问题描述】:

我正在尝试遍历 FTP 站点上的所有 CSV 文件,并将具有特定文件名的 CSV 内容上传到数据库。
到目前为止,我已经能够

  • 使用...访问 FTP

    getURL((url, userpwd = userpwd, ftp.use.epsv = FALSE, dirlistonly = TRUE),

  • 使用...获取文件名列表

    unlist(strsplit(filenames, "\r\n"),

  • 并创建一个包含完整网址列表的数据框(例如ftp://sample@ftpserver.name.com/samplename.csv),使用...

    for (i in seq_along(myfiles)) {
      url_list[i,] <- paste(url, myfiles[i],  sep = '')
       }
    

如何循环遍历此数据框,过滤某些文件名,以便使用相关 CSV 中的所有数据创建一个新数据框? (一半文件命名为 Type1SampleName,一半命名为 Type2SampleName)

然后我会将这些数据上传到数据库。

谢谢!

【问题讨论】:

  • 文件名有什么变化?数字?顺便说一句,您不需要循环或数据框:urls &lt;- paste0(url, myfiles)
  • 我实际上想出了如何使用 grepl myfiles &lt;- myfiles[grepl("Type1", myfiles)] 过滤文件名你的建议很有魅力——比循环简单得多。我是否正确地说这会创建一个包含所有 URL 的向量?我尝试使用以下 CSV URL 加载数据:mydata &lt;- lapply(urls, getURL, userpwd = userpwd, connecttimeout = 60) 这将创建一个列表,其中包含来自每个 CSV 的所有原始、未格式化的数据。我现在正试图弄清楚如何将这些数据加载到数据框中。数据看起来像:\r\n\",\"7.775\",\"7.875\",\"-0.025\"\r\n" 有什么想法吗?谢谢。
  • 有什么想法吗?快到了!

标签: r loops ftp


【解决方案1】:

由于RCurl::getURL 在此处返回作为 CSV 内容的直接 HTTP 响应,请考虑扩展您的 lapply 函数调用以使用 text 参数将结果传递到 read.csv

# VECTOR OF URLs
urls <- paste0(url, myfiles[grep("Type1", myfiles])

# LIST OF DATA FRAMES FROM EACH CSV
mydata <- lapply(urls, function(url) {
     resp <- getURL(url, userpwd = userpwd, connecttimeout = 60)
     read.csv(text = resp)
})

另外,getURL 支持带有 write 参数的回调函数:

或者,如果为write 参数提供了一个值,则会返回该值。这允许调用者在调用中创建处理程序并将其取回。这避免了必须显式创建和分配它,然后调用getURL 然后访问结果。相反,这 3 个步骤可以在一个调用中内联。

# USER DEFINED METHOD
import_csv <- function(resp) read.csv(text = resp)

# LONG FORM NOTATION
mydata <- lapply(urls, function(url)
      getURL(url, userpwd = userpwd, connecttimeout = 60, write = import_csv)
)

# SHORT FORM NOTATION
mydata <- lapply(urls, getURL, userpwd = userpwd, connecttimeout = 60, write = import_csv)

【讨论】:

    【解决方案2】:

    只是关于我如何完成这项工作以及最终对我有用的更新...

    mydata <- lapply(urls, getURL, userpwd = userpwd, connecttimeout = 60)
    

    从上往下..

    while (i <= length(mydata)) {
    
    mydata1 <- paste0(mydata[[i]])
    
    bin <- read.csv(text = mydata1, header = FALSE, skip = 1)
    
    #Column renaming and formatting here
    #Uploading to database using RODBC here
    }
    

    感谢@Parfait 的指点 - 非常感谢。 像大多数问题一样,在你完成后它看起来很简单!

    【讨论】:

      猜你喜欢
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 2016-08-03
      • 2021-08-04
      • 2021-06-24
      • 1970-01-01
      相关资源
      最近更新 更多