如何查找文件模式是否在 S3_bucket 位置

How to find if a file pattern is in the S3_bucket location

我需要比较 S3 文件夹,如果其中任何一个包含与雪花中的 config.file_pattern 具有相似内容的文件名 table :


我在 snowflake 中有一个 table (Config table),它存储一个名为 file_pattern 的列,其值类似于“ .file_name_pattern.csv”。 (它就像一张白纸牌在SQL前后*它可以有任何值)。它还有其他文件格式,如 .txt 、.xls ,所以我的意思是说 CSV 不是一个常量值。 我需要将此 file_pattern 与 S3 存储桶文件列表进行比较,看看该文件夹是否包含与 file_pattern 相匹配的内容

Select file_pattern 来自配置;

file_pattern
.*file_name_pattern1*.csv
.*file_name_pattern2*.txt
.*file_name_pattern3*.png

下面是示例 S3 文件夹结构

DIR1/DIR2/DIR3/DIR4/file_name_pattern1_20190904.CSV


###问题:###

如何将雪花列 file_pattern 中的通配符字段与 S3 文件夹进行比较。 棘手的部分是,我在比较时还应该考虑 .csv,而不仅仅是 file_pattern.

我尝试在“*file_name_pattern*.csv”中将记录从 * 拆分为 *,同样,这不会考虑最后的 .csv

File_Pattern = [.*file_name_pattern1*.csv , .*file_name_pattern2*.pgp, *File_name_pattern.*.txt]

item['Key'] = DIR1/DIR2/DIR3/DIR4/file_name_pattern_20190904.CSV(这是s3 folder/file列表的结果,我是通过连接得到的通过 boto3 到 S3)

下面是我试过的初始版本,它显然不起作用,因为它是一对一的比较

for file in File_Pattern :

    if file in item['Key']:

        "Run a query"

尝试 2 :


for file in File_Pattern :

    file_1 = file.split('*') #(result was like [.,file_name_pattern1,.csv]

    if file_1[1] in item['Key']:

        "Run a query"

如果我只比较 file_1[1]

,我会丢失 .csv

我不知道该如何处理

我不确定我是否理解确切的问题,但听起来文件模式中存在“*”确实让您感到困惑。

我认为你走在正确的道路上。忽略 '' 可能会起作用,因为 in 运算符无论如何都会在 '' 之间查找该段并关注文件末尾(即文件类型,.csv , .txt).

第二次尝试,例如,您可以稍微调整一下以添加第二个条件以说明扩展:

file_1 = file.split('*') #(result was like [.,file_name_pattern1,.csv]
if file_1[1] in item['Key'] and file_1[-1] == item['Key'][-4:]:

此处您要求匹配模式和扩展名。 file_1[-1] 将是 '.csv'、'.txt' 等,即扩展部分,它将是拆分结果的最后一个元素。 item['Key'][-4:] 会给你最后 4 个字母。