从R

时间:2018-01-17 06:32:32

标签: r amazon-web-services amazon-s3

我已经使用API​​数据实时更新了S3存储桶。文件以.XXX格式保存,其中xxx为1 ... n。

My R脚本需要能够获取最新文件并将其添加到分析数据框中。到目前为止,我一直在使用aws.s3包。将环境/访问密钥设置为环境后:

mybucket <- get_bucket("mybucket1")

返回1000个元素的s3对象(可能更多),看起来每个对象都有Contents:list if if 7,其中一个是$ LastModified。如何获取上次修改文件的名称?

Mybucket     Large s3_bucket (1000 elements, 2.1Mb)
contents:List of 7
..$ Key : chr "folder1"
..$ LastModified: chr "2018-01-16T09:58:47.000Z"
..$ ETag : chr "\" nnnnnnnnnnn\""
etc (.. $Owner, $Storage class, $bucket, $-attr)
contents: List of 7
..$ Key : chr "folder1/file.1
..$ LastModified: chr "2018....etc"
..$ ETag : chr "...etc..."
etc....
contents: List of 7
etc.....

确实是#file;之后的数字。&#39;我需要的(在这种情况下,它将是1)。

经过实验,我认为通过RCurl的CLI命令将是一个更好的选择。

aws s3 ls s3://mybucket --recursive | grep APIdata@symbol=XXX&interval=5.1*

这让我非常接近,但命令却忽略了&#39;&amp; interval = 5.1 *&#39;所以它使用&#39; APIdata @ symbol = XXX *&#39;

返回所有对象

2 个答案:

答案 0 :(得分:0)

我认为您的问题与AWS S3无关,我会将其归类为如何从列表列表中创建data.frame ,并且现有答案,例如: G:

R list of lists to data.frame

我的解决方案使用了包rbindlist中的方便data.table

我不得不猜测Mybucket的数据类型,但解决方案可能如下所示:

# https://cran.r-project.org/web/packages/aws.s3/aws.s3.pdf
# get_bucket: returns a list of objects in the bucket (with class “s3_bucket”)
library(data.table)
library(lubridate)

# my personal assumption of the output of "get_bucket" is list of list (I have no S3 at hand to verify this)
Mybucket <- list(  list(Key = "folder1/file.1", LastModified = "2018-01-16T09:58:47.000Z", ETag = "\" nnnnnnnnnnn\"")
                 , list(Key = "folder2/file.2", LastModified = "2018-01-16T08:58:47.000Z", ETag = "xyz"))

dt <- rbindlist(Mybucket)  # convert into a data.table (enhanced data.frame)

dt[, LastModAsDate := ymd_hms(LastModified)]  # add a data column

dt.most.recent <- dt[order(-dt$LastModAsDate),][1]  # order by date descending, then pick the top-most row

导致

> dt.most.recent
              Key             LastModified           ETag       LastModAsDate
1: folder1/file.1 2018-01-16T09:58:47.000Z " nnnnnnnnnnn" 2018-01-16 09:58:47

请注意,日期转换可能会失去精度(毫秒),但总体解决方案无论如何都会勾画出来......

要提取文件扩展名中包含的数字,请使用:

tools::file_ext(dt.most.recent$Key)
# [1] "1"

答案 1 :(得分:0)

最简单的方法是使用系统命令:

currentfile <- system("aws s3 ls s3://bucket/folder --recursive | grep 'file.16' | sort | tail -n 1 | awk '{print $4}'", intern=TRUE)

grep抓取存在'file.16'的文件,这显着缩小了搜索范围,因为当前文件列表在1600年代。 Intern = TRUE保存响应,在这种情况下将其作为字符串保存在“currentfile”中。按修改日期排序,尾部和打印$ 4订单文件,取最后修改的第4列(名称)。

供参考:Downloading the latest file in an S3 bucket using AWS CLI?