我已经使用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;
返回所有对象答案 0 :(得分:0)
我认为您的问题与AWS S3无关,我会将其归类为如何从列表列表中创建data.frame
,并且现有答案,例如: G:
我的解决方案使用了包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?