如何查找文件模式是否在 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 个字母。
我需要比较 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 个字母。