ABL Progress OpenEdge:使用分隔符更新 csv 文件中的记录

ABL Progress OpenEdge: Updating records in csv file with delimiter

提问人:Amber p 提问时间:10/23/2023 最后编辑:Tom BascomAmber p 更新时间:10/23/2023 访问量:86

问:

我正在做能够刷新数据库环境的第一步。

首先,我将环境 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(第一列)已经存在。这意味着它存在于文件中的另一行(这是我删除记录之前的下一行)。

开发 生产环境 OpenEdge Progress-4GL

评论

0赞 Tom 10/23/2023
您是否考虑过使用数据管理工具来转储和加载表内容?

答:

5赞 Tom Bascom 10/23/2023 #1

我认为您的根本问题是您不应该在导入块中使用 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”。

(上面的代码都是伪代码,没有经过测试。它只是概述一般方法。

评论

0赞 Amber p 10/24/2023
嗨,汤姆,感谢您的建议方法。我选择用于每个,因为我最终需要它确实可以在大桌子上操作。我还编写了重复的脚本以添加新记录。正如您提到的,我不确定在这种情况下删除 test12 中的现有数据以从 test1 添加更新的数据是否是最好的方法。
0赞 Amber p 10/24/2023
我已经定义了一种可能有效的方法,但我太缺乏经验,不知道这在 ABL 中是否可行。 你愿意启发吗?通过匹配 table1 和 table2 中的条目 ID 来比较 2 个临时表,如果相等,则用该 entryID 的 table1 数据行覆盖 table2 的数据。如果没有,则不执行任何操作(因为我们运行使用其他脚本添加的新记录)。最后,导入 Table2。
2赞 Tom Bascom 10/24/2023
我认为你需要从代码中退后一步,更多地努力明确定义你要完成的任务。是的,无论它是什么,“在 ABL 中都是可能的”。但是,在解决问题之前,您必须能够描述问题。