如何用Progress 4GL统计CSV行数、切换工作表并解析指定行数据
解决Progress 4GL读取CSV第二行及Excel工作表的问题
Hey there! Let's break down your two issues and fix them up:
1. 只读取CSV文件的第二行
你的当前代码会遍历所有行并全部存入临时表,要只读取第二行,我们可以加一个行计数器来控制流程:跳过第一行,处理第二行后直接退出循环。
修改后的代码如下:
DEFINE TEMP-TABLE tt_sec7Role FIELD ttsec_role AS CHARACTER. DEFINE VARIABLE v_dataline AS CHARACTER NO-UNDO. DEFINE VARIABLE v_count AS INTEGER NO-UNDO. DEFINE VARIABLE v_lineNum AS INTEGER NO-UNDO INITIAL 0. // 新增行计数器 EMPTY TEMP-TABLE tt_sec7Role. INPUT FROM "C:\Users\ast\Desktop\New folder\cit.csv". REPEAT: IMPORT UNFORMATTED v_dataline. v_lineNum = v_lineNum + 1. // 跳过第一行,只处理第二行 IF v_lineNum = 2 AND v_dataline <> '' THEN DO: DO v_count = 1 TO NUM-ENTRIES(v_dataline,','): CREATE tt_sec7Role. ttsec_role = ENTRY(v_count, v_dataline, ','). END. EXIT REPEAT. // 处理完第二行就退出循环,不再读取后续行 END. END. INPUT CLOSE. // 验证临时表数据 v_count = 0. FOR EACH tt_sec7Role: v_count = v_count + 1. END. MESSAGE "临时表条目数: " v_count VIEW-AS ALERT-BOX.
关键改动说明:
- 新增
v_lineNum计数器跟踪当前读取的行号 - 仅当行号为2且行内容非空时,才将数据存入临时表
- 处理完第二行后用
EXIT REPEAT终止循环,避免读取多余行
2. 关于CSV的"工作表"说明及Excel工作表处理
首先要澄清:CSV是纯文本格式,没有工作表(Worksheet)的概念,它就是单一的纯文本数据集合。如果你说的是Excel文件(.xlsx/.xls)里名为sec的工作表,那我们可以通过Progress的OLE功能来操作Excel并读取指定工作表的数据。
以下是读取Excel中sec工作表数据的示例代码:
DEFINE VARIABLE hExcel AS HANDLE NO-UNDO. DEFINE VARIABLE hWorkbook AS HANDLE NO-UNDO. DEFINE VARIABLE hWorksheet AS HANDLE NO-UNDO. DEFINE VARIABLE vRow AS INTEGER NO-UNDO. DEFINE VARIABLE vCol AS INTEGER NO-UNDO. DEFINE VARIABLE vCellValue AS CHARACTER NO-UNDO. EMPTY TEMP-TABLE tt_sec7Role. // 初始化OLE连接到Excel CREATE OLEOBJECT hExcel. hExcel:CONNECT("Excel.Application"). hExcel:Visible = FALSE. // 后台运行Excel,不显示窗口 // 打开目标Excel文件 hWorkbook = hExcel:Workbooks:OPEN("C:\Users\ast\Desktop\New folder\cit.xlsx"). // 切换到名为"sec"的工作表 hWorksheet = hWorkbook:Worksheets("sec"). // 读取数据(示例:从第一行第一列开始读取非空行) vRow = 1. DO WHILE hWorksheet:Cells(vRow, 1):Value <> '': vCol = 1. DO WHILE hWorksheet:Cells(vRow, vCol):Value <> '': vCellValue = hWorksheet:Cells(vRow, vCol):Value. CREATE tt_sec7Role. ttsec_role = vCellValue. vCol = vCol + 1. END. vRow = vRow + 1. END. // 清理资源 hWorkbook:CLOSE(FALSE). // 不保存关闭工作簿 hExcel:QUIT(). hExcel:DISCONNECT(). DELETE OBJECT hExcel. // 验证数据 v_count = 0. FOR EACH tt_sec7Role: v_count = v_count + 1. END. MESSAGE "临时表条目数: " v_count VIEW-AS ALERT-BOX.
注意事项:
- 确保目标文件是Excel格式(.xlsx/.xls)而非CSV
- 运行代码的机器需要安装Excel,且Progress有OLE操作权限
- 可以根据需求调整读取的起始行/列逻辑
内容的提问来源于stack exchange,提问作者Thiru
相关产品推荐
相关产品推荐

