反馈已提交

网络繁忙

文件拆分:只保留最新拆分的文件

  • 文档创建者:Wendy123456
  • 历史版本:9
  • 最近更新:Wendy123456 于 2024-03-26
  • 1. 概述

    1.1 应用场景

    文件输出算子 可将数据按行数拆分至多个文件,但存在以下问题:

    场景
    问题
    每次运行后,被拆分的文件存在重名情况

    用户多次运行任务,根据数据量不同,被拆分的文件个数可能不同

    若用户第一次运行任务,数据被拆分为 5 个文件,第二次运行任务数据被拆分为 3 个文件,上一次被拆分的文件依然存在,影响用户查看文件数据

    每次运行后,被拆分的文件不存在重名情况

    若被拆分的文件以日期和时间命名,文件不重名,但随着运行次数增多,生成的拆分文件过多,占用空间

    本文提供方案解决上述问题。

    1.2 实现思路

    使用「shell 脚本」节点和「文件输出」算子:

    • 文件输出算子将处理后的数据按照行数拆分为多个文件。

    • shell 脚本节点,每次只保留最新的拆分文件,将上一次生成的文件打包压缩备份起来,且只保留近 7 天的压缩文件。

    2. 示例一:拆分为 Excel 文件

    2.1 数据连接准备

    1)本文方案中,需要使用 shell脚本 节点,所以需要配置 SSH 数据连接。步骤请参见:配置SSH协议数据连接

    2)本文方案中,需要使用 文件输出算子 将数据拆分并输出为文件,所以需要准备一个FTP/SFTP/服务器本地目录数据连接,本文示例中,准备的是 FTP/SFTP 数据连接。

    注:SSH 文件与被拆分后的文件需要在一个服务器上。

    2.2 SH 文件准备

    1)准备.sh脚本文件。

    示例文件:生成EXCEL文件.zip

    .sh 文件代码如下:

    用户根据实际情况修改下面代码,本文示例中,被拆分后的文件保存在/opt/ceshi/wendy下,所以 search_path 的值为/opt/ceshi/wendy

    被拆分的文件名为 folder_name 值+日期,若有多个文件,名字末尾以数字递增,例如:测试2024-03-26.xlsx;本文示例中,folder_name 值为测试,被拆分后的文件名中的日期在本文 2.3、2.5 节中设置。

    #!/bin/bash
    timestamp=$(date +%Y-%m-%d-%H:%M:%S) # 获取当前时间
    # 定义要压缩的文件列表(包括路径)
    folder_name="测试" # 将此处修改为需要查找和删除的文件夹名
    search_path="/opt/ceshi/wendy"   # 将此处修改为目标文件夹的路径

    find "$search_path" -type f -iname "*$folder_name*.xlsx" -exec tar -rvf "$search_path/$folder_name备份_$timestamp.tar" {} +
    # 如果 tar 文件为空(即没有找到文件),则删除它
    if [ ! -s "$search_path/$folder_name_$timestamp.tar" ]; then
        rm "$search_path/$folder_name_$timestamp.tar"
        echo "没有找到名为 $folder_name 的 .xlsx 空文件,因此未删除压缩文件。"
    fi

    days_ago=$(date -d "7 days ago" +%Y%m%d)

    # 使用find命令找到并删除7天前的.tar文件
    find "$search_path" -type f -name "*.tar" ! -newermt "$days_ago" -exec rm -f {} \;

    # 输出完成消息
    echo "已删除超过$days_ago前的所有.tar文件。" 
    find "$search_path" -type f -iname "*$folder_name*.xlsx" -delete

    2)将 .sh 脚本文件上传到/opt/ceshi下。如下图所示:

    1711419624748874.png

    3)赋予 .sh 脚本文件执行权限。如下图所示:

    chmod +x wenjian.sh

    1711419707280733.png

    2.3 添加参数

    本文示例中,被拆分的文件名为 2.2 节中的 folder_name 值+日期,若有多个文件,名字末尾以数字递增,例如:测试2024-03-26.xlsx

    被拆分的文件名称中包含日期,方便删除 7 天之前的文件。所以,需添加一个日期参数,被拆分文件名称中引用该参数即可。

    1)新建定时任务。

    2)点击工具栏中的参数列表,添加参数 date ,类型为日期,值为 yyyy-mm-dd 。如下图所示:

    27.png

    2.4 设置 shell 脚本节点

    拖入「shell脚本」节点。SSH 连接选择 2.1 节中配置的 SSH 数据连接,「脚本路径」中输入 SH 文件所在的路径,如下图所示:

    1711419764987357.png

    2.5 文件拆分并输出

    1)拖入「数据转换」节点,与「shell脚本」节点相连,进入「数据转换」节点。

    2)拖入DB表输入算子,读取文件数据。如下图所示:

    26.png

    3)拖入文件输出算子,将数据拆分为多个文件。

    文件目标选择 2.1 节中的 FTP/SFTP 数据连接;文件夹地址选择 2.2 节中 SH 文件的 search_path 值;文件名为 2.2 节中 SH 文件的 folder_name 值+2.3节的参数,为测试${date};每 200 行拆分为一个文件,文件重名策略选择:文件重名,停止写入并报错。如下图所示:

    13.png

    4)点击右上角「保存」按钮。

    2.6 效果查看

    1)运行该任务后,被拆分的文件如下图所示:

    1711419868123298.png

    2)每次运行后,会将上一次生成的文件打包压缩备份起来,为展示该效果,将本文 2.5 节中每 200 生成一个新文件,改为每400 行生成一个新文件。运行后,结果如下图所示:

    可看到,该文件夹下只保留最新生成的文件,上一次生成的文件会打包压缩备份起来。

    自动删除 7 天之前压缩文件的效果本文不做展示。

    1711420320718597.png

    2.7 设置执行频率

    在 调度计划 中可设置执行频率。如下图所示:

    18.png

    3. 示例二:拆分为 CSV 文件

    3.1 数据连接准备

    参考本文 2.1 节内容。

    3.2 SH 文件准备

    与本文 2.2 节不同的是,.sh 文件内容不同。

    将文件后缀改下就行,完整步骤参考本文 2.2 节。

    示例文件:SH文件.zip

    16.png

    #!/bin/bash
    timestamp=$(date +%Y-%m-%d-%H:%M:%S) # 获取当前时间
    # 定义要压缩的文件列表(包括路径)
    folder_name="测试" # 将此处修改为需要查找和删除的文件夹名
    search_path="/opt/ceshi/wendy"   # 将此处修改为目标文件夹的路径

    find "$search_path" -type f -iname "*$folder_name*.CSV" -exec tar -rvf "$search_path/$folder_name备份_$timestamp.tar" {} +
    # 如果 tar 文件为空(即没有找到文件),则删除它
    if [ ! -s "$search_path/$folder_name_$timestamp.tar" ]; then
        rm "$search_path/$folder_name_$timestamp.tar"
        echo "没有找到名为 $folder_name 的 .CSV 空文件,因此未删除压缩文件。"
    fi

    days_ago=$(date -d "7 days ago" +%Y%m%d)

    # 使用find命令找到并删除7天前的.tar文件
    find "$search_path" -type f -name "*.tar" ! -newermt "$days_ago" -exec rm -f {} \;

    # 输出完成消息
    echo "已删除超过$days_ago前的所有.tar文件。" 
    find "$search_path" -type f -iname "*$folder_name*.CSV" -delete

    3.3 后续步骤

    1)参考本文 2.3、2.4 节内容。

    2)参考本文 2.5 节输出文件,与 2.5 节不同的是,输出为 CSV 类型的文件。如下图所示:

    17.png

    3)参考 2.7 节设置执行频率。




    附件列表


    主题: 数据开发-定时任务
    已经是第一篇
    已经是最后一篇
    • 有帮助
    • 没帮助
    • 只是浏览
    • 评价文档,奖励 1 ~ 100 随机 F 豆!

    鼠标选中内容,快速反馈问题

    鼠标选中存在疑惑的内容,即可快速反馈问题,我们将会跟进处理。

    不再提示

    10s后关闭



    AI

    联系我们
    在线支持
    获取专业技术支持,快速帮助您解决问题
    工作日9:00-12:00,13:30-17:30在线
    页面反馈
    针对当前网页的建议、问题反馈
    售前咨询
    采购需求/获取报价/预约演示
    或拨打: 400-811-8890 转1
    qr
    热线电话
    咨询/故障救援热线:400-811-8890转2
    总裁办24H投诉:17312781526
    提交页面反馈
    仅适用于当前网页的意见收集,帆软产品问题请在 问答板块提问前往服务平台 获取技术支持