提问人:Amber p 提问时间:10/23/2023 最后编辑:Tom BascomAmber p 更新时间:10/23/2023 访问量:86
ABL Progress OpenEdge:使用分隔符更新 csv 文件中的记录
ABL Progress OpenEdge: Updating records in csv file with delimiter
问:
我正在做能够刷新数据库环境的第一步。
首先,我将环境 1 中的表导出到名为 Test1 的 csv 文件中。
OUTPUT TO VALUE("X:\Test\Test1.csv").
FOR EACH Test1 NO-LOCK:
EXPORT DELIMITER ',' Test1.
END.
OUTPUT CLOSE
然后我将此文件导入环境 2,如果 test1 中的所有记录都存在于环境 2 中,则该文件是未知的。如果顺序相同,也不知道(这是以下内容功能受限的地方)
INPUT FROM "X:\Test\Test1.csv".
FOR EACH Test12:
IMPORT DELIMITER ',' Test1.
END.
因此,我需要能够查看环境 2 中的现有记录是否存在于从环境 1 导出的文件 Test1 中,并通过在环境 2 中调整这些记录来应用更改/更新。
不幸的是,我无法更具体地说明姓名和日期,因为它是机密的
我尝试使用显示的脚本在 notepadd++ 中编辑 exportfile Test1,方法是删除仍然运行良好的记录。然而,当我还通过删除记录删除了我留下的空白规则时,所有内容都向上移动了一行,它提到 entryID(第一列)已经存在。这意味着它存在于文件中的另一行(这是我删除记录之前的下一行)。
答:
我认为您的根本问题是您不应该在导入块中使用 FOR EACH。
您可能想要做的是使用 REPEAT 块来导入数据。
像这样:
REPEAT:
CREATE tableName.
IMPORT DELIMITER "," tableName.
END.
可能放入临时表记录中,并将导入的记录与现有表进行比较,然后决定是否更新现有记录(如果存在差异)。
DEFINE TEMP-TABLE tt_tableName LIKE tableName.
CREATE tt_tableName.
REPEAT:
IMPORT DELIMITER "," tt_tableName.
FIND tableName EXCLUSIVE-LOCK WHERE tableName.id = tt_tableName.id NO-ERROR. /* The "id" field is just something that I made up - use whatever the real table has for a UNIQUE key in the WHERE clause */
IF AVAILABLE( tableName ) THEN
DO:
/* do whatever is appropriate to merge the data */
END.
END.
注意:此方法不会检测“test”中缺少的记录,并且应从“test12”中删除这些记录,除非您的“任何适当的”合并逻辑可能在字段中使用“magic”值来指示应删除记录。
如果您只是将现有的“test12”数据替换为“test”,那么您应该首先删除“test12”数据。对于小表,您可以使用以下方法合理地做到这一点:
FOR EACH tableName exclusive-lock:
DELETE tableName.
END.
对于大桌子,可能会变得非常痛苦。对于那些,您最好将大桌子放入专用存储区域并使用“proutil -C truncate area”。
(上面的代码都是伪代码,没有经过测试。它只是概述一般方法。
评论