如何从SAP Data Services读取含可变6位时间的日期格式文件名
在SAP Data Services中读取带可变6位时间的日期命名文件
我来帮你解决这个SAP Data Services里的文件名匹配问题,刚好之前处理过类似场景。你遇到的核心问题是:直接用*.csv无法精准锁定指定日期+可变6位时间的文件,而你之前的脚本写法没用到Data Services正确的通配符规则。
方案一:用通配符快速匹配(简单直接)
SAP Data Services的文件名属性支持用?匹配单个任意字符,刚好可以对应你那6位可变的时间数字。
你可以直接在平面文件的「文件名」属性里写:
File_$(to_char(sysdate()-1, 'YYYYMMDD'))_??????.csv
如果要通过脚本变量赋值,就把代码改成:
$Filename = 'File_' || to_char(sysdate()-1, 'YYYYMMDD') || '_??????.csv';
然后把平面文件的文件名属性绑定到$Filename变量即可。这里的??????正好匹配任意6个字符(你的6位时间数字),完美覆盖需求。
方案二:用正则表达式严格过滤(更严谨)
如果需要确保时间部分是纯数字,而不是任意6个字符,可以结合directory_list和正则函数来精准筛选:
- 先获取目标目录下的所有CSV文件:
$FileList = directory_list('你的文件存放路径', '*.csv', 0);
- 构造匹配前一天日期+6位数字的正则规则,遍历文件列表筛选:
$TargetDate = to_char(sysdate()-1, 'YYYYMMDD'); // 正则规则:匹配File_日期_6位数字.csv $Pattern = 'File_' || $TargetDate || '_[0-9]{6}\.csv'; // 遍历文件列表找匹配项 for ($i = 1; $i <= length($FileList); $i++) { $CurrentFile = $FileList[$i]; if (regex_match($CurrentFile, $Pattern, 0)) { $Filename = $CurrentFile; break; // 找到第一个匹配文件就跳出,按需调整逻辑 } }
- 最后把平面文件的文件名设置为
$Filename即可。
为什么你之前的脚本不行?
你之前写的'*.csv'会匹配目录下所有CSV文件,而不是限定在指定日期之后的6位时间部分。而且Data Services里的*是匹配任意长度的字符,不是你需要的固定6位,所以用??????才是正确的做法。
注意事项
- 确认
sysdate()-1的时区和文件名里的日期时区一致,避免出现日期不匹配的跨天问题。 - 如果目录下有多个同一天的目标文件,方案一会一次性读取所有符合条件的文件(需要在平面文件设置里开启「读取多个文件」);方案二则可以灵活选择读取第一个或者全部,根据你的业务需求调整循环逻辑。
内容的提问来源于stack exchange,提问作者naoufelabs
相关产品推荐
相关产品推荐

