如何在Progress4GL中实现超100万行.csv文件的自动拆分
Progress 4GL 实现CSV大文件拆分方案
实现逻辑
- 按行读取源CSV文件,默认每100万行拆分生成一个新文件
- 可选配置:是否给每个拆分文件都携带源文件的表头(适合带表头的标准CSV格式)
- 自动按规则命名拆分后的文件,如
filename-01.csv、filename-02.csv格式
完整代码示例
DEFINE VARIABLE iLineCount AS INTEGER NO-UNDO. DEFINE VARIABLE iFileSeq AS INTEGER NO-UNDO. DEFINE VARIABLE cSourceFile AS CHARACTER NO-UNDO INIT "你的源文件路径/filename.csv". DEFINE VARIABLE cTargetFile AS CHARACTER NO-UNDO. DEFINE VARIABLE cLineContent AS CHARACTER NO-UNDO. DEFINE VARIABLE cHeader AS CHARACTER NO-UNDO. DEFINE VARIABLE iMaxLines AS INTEGER NO-UNDO INIT 1000000. /* 单文件最大行数 */ /* 打开源CSV文件 */ INPUT FROM VALUE(cSourceFile). /* 读取表头(如果不需要保留表头可以删除这部分) */ IMPORT UNFORMATTED cHeader. /* 初始化第一个拆分文件 */ iFileSeq = 1. iLineCount = 0. cTargetFile = REPLACE(cSourceFile, ".csv", "-" + STRING(iFileSeq, "99") + ".csv"). OUTPUT TO VALUE(cTargetFile). /* 写入表头 */ PUT UNFORMATTED cHeader SKIP. /* 逐行读取源文件内容 */ REPEAT: IMPORT UNFORMATTED cLineContent. /* 达到行数阈值时切换到下一个文件 */ IF iLineCount >= iMaxLines THEN DO: OUTPUT CLOSE. iFileSeq = iFileSeq + 1. iLineCount = 0. cTargetFile = REPLACE(cSourceFile, ".csv", "-" + STRING(iFileSeq, "99") + ".csv"). OUTPUT TO VALUE(cTargetFile). /* 新文件写入表头 */ PUT UNFORMATTED cHeader SKIP. END. /* 写入当前行到目标文件 */ PUT UNFORMATTED cLineContent SKIP. iLineCount = iLineCount + 1. END. /* 关闭所有打开的文件句柄 */ INPUT CLOSE. OUTPUT CLOSE.
注意事项
- 如果你的CSV没有表头,直接删除代码中读取、写入表头的相关代码段即可
- 可以根据实际需求修改
iMaxLines变量的值调整单文件的最大行数 - 文件名序列的格式化字符串
"99"支持最多生成99个拆分文件,如果你需要拆分更多文件,可以调整为"999"等更长的格式 - 该方案是逐行读取写入,内存占用极低,适合处理GB级别的超大CSV文件
内容的提问来源于stack exchange,提问作者Varun K S
相关产品推荐
相关产品推荐

