OpenEdge技术问题:如何从CSV文件中读取特定值?
从CSV读取特定值的解决方案
你的现有代码会将CSV的所有数据全量导入临时表,若仅需读取特定值,可通过以下几种方式实现:
1. 仅导入需要的特定列
先定义仅包含目标字段的临时表结构,再在IMPORT语句中明确指定要导入的字段,避免全量导入:
/* 定义临时表,只保留需要的字段 */ DEF TEMP-TABLE ttTable FIELD custId AS INTEGER FIELD custName AS CHARACTER. INPUT VALUE FROM cFilePath. REPEAT: CREATE ttTable. /* 仅导入custId和custName列,需匹配CSV中对应列的位置 */ IMPORT ttTable.custId, ttTable.custName DELIMITER ",". END. INPUT CLOSE. /* 查看导入的特定值 */ FOR EACH ttTable: DISPLAY ttTable.custId ttTable.custName. END.
2. 全量导入后筛选特定值
若需基于条件提取特定记录(比如某ID对应的行),可先全量导入,再通过WHERE条件筛选:
DEF TEMP-TABLE ttTable FIELD custId AS INTEGER FIELD custName AS CHARACTER FIELD custEmail AS CHARACTER. INPUT VALUE FROM cFilePath. REPEAT: CREATE ttTable. IMPORT DELIMITER ",". END. INPUT CLOSE. /* 筛选custId=100的记录,提取目标值 */ FOR EACH ttTable WHERE ttTable.custId = 100: DISPLAY "目标客户名称: " ttTable.custName "邮箱: " ttTable.custEmail. END.
3. 不导入临时表,直接读取特定行/列
若仅需某一行的某个值,无需全量导入临时表,直接逐行解析CSV即可:
DEF VAR cLine AS CHARACTER NO-UNDO. DEF VAR aCols AS CHARACTER EXTENT NO-UNDO. DEF VAR iTargetRow AS INTEGER NO-UNDO INIT 3. /* 目标行,例如第3行 */ INPUT VALUE FROM cFilePath. /* 跳过表头(若CSV包含表头) */ IMPORT cLine. REPEAT: IMPORT DELIMITER "," cLine. /* 将当前行拆分为数组 */ aCols = SPLIT(cLine, ","). /* 读取第2列(客户名称)和第3列(邮箱) */ IF CURRENT-REPEAT = iTargetRow THEN DO: DISPLAY "第" iTargetRow "行的客户名称: " aCols[2] "邮箱: " aCols[3]. LEAVE. /* 找到目标行后退出循环 */ END. END. INPUT CLOSE.
内容的提问来源于stack exchange,提问作者Misteris3
相关产品推荐
相关产品推荐

