【问题标题】:Import in Openedge在 Openedge 中导入
【发布时间】:2017-08-23 08:04:45
【问题描述】:

美好的一天。

我在link 中有一个先前的问题。在导出的 csv 中,我在第一行添加了TABLE NAME。我希望将此 CSV 导入我的系统。

我当前的代码是这样的:

DEF VAR ic as INT.
DEF VAR cTable as CHAR.

INPUT FROM VALUE(SESSION:TEMP-DIRECTORY + "temp.csv").

ic = 0.
REPEAT:

    ic = ic + 1.

    IF ic > 1 THEN DO:
        CREATE cTable.
        IMPORT DELIMITER "," cTable.
    END.

    IMPORT cTable.

END.

INPUT CLOSE.

我知道CREATE 部分的代码有误。我该怎么做?

另外,当我导出时,最后一条记录之后还有一个额外的空白行。如何在不打开 CSV 文件的情况下删除它?

【问题讨论】:

  • 您需要为此使用不同的语法,即动态语法,它要复杂得多。但是数据字典中有工具可以转储和加载表,所以也许你不需要这样做?

标签: openedge progress-4gl


【解决方案1】:

删除文件末尾的空行并不能解决您的问题,更糟糕的是,如果您这样做,您将无法使用 IMPORT 语句读取最后一个有效的 CSV 行(它需要在结束正常工作)。

实际的问题是您的表中有一个空行,因为当REPEAT 块到达文件末尾以离开引发ENDKEY 条件的循环时,IMPORT DELIMITER "," cTable. 失败。但是由于您在循环离开之前调用CREATE cTable.,因此您会得到一个空条目。我希望这个解释可以帮助你理解 REPEAT 循环是如何工作的,如果你不知道它看起来就像一个没有任何中断条件的无限循环。

无论如何,要解决该问题,您可以删除空行(就像您之前所做的那样),这是完全有效的,或者您可以从临时表定义中省略 NO-UNDO,因为这样 REPEATUNDO默认为CREATE

对于关于 CSV 标题行的其他问题,您必须以某种方式阅读该行,我认为没有语句可以跳过它并从文件中的 2. 行开始阅读。 如果您需要标题名称,您可以简单地为每一列定义一个 char 变量并将其导入:

IMPORT DELIMITER "," cColumn1 cColumn2. /* for every column */

或者如果你只是想阅读并忽略它,你可以使用

IMPORT UNFORMATTED cTemp.

使用读取整行的临时变量。

【讨论】:

    【解决方案2】:

    如果您尝试导入未知的文件格式,您可以尝试读取整行数据,然后选择各个字段。至于问题 2,最好以编程方式处理不正确的数据,而不是尝试更改文件本身。

    此代码从文件中读取每一行,跳过任何空白或空行。然后它遍历行中每个逗号分隔的字段并显示它们。

    DEFINE VARIABLE cTable AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cField AS CHARACTER NO-UNDO.
    DEFINE VARIABLE iLoop  AS INTEGER NO-UNDO.
    
    INPUT FROM VALUE(SESSION:TEMP-DIRECTORY + "temp.csv").
    
    REPEAT ON ERROR UNDO, NEXT:
    
        IMPORT UNFORMATTED cTable.  /* Read an entire line from the file. */
    
        IF cTable = "" OR cTable = ? THEN NEXT.  /* Skip blank lines. */
    
        DO iLoop = 1 TO NUM-ENTRIES(cTable, ","):  /* Break up the line by the comma delimiter. */
    
            cField = ENTRY(iLoop, cTable).
            MESSAGE "Field " + STRING(iloop) + ": " + cField VIEW-AS ALERT-BOX.
    
        END.
    
    END.
    
    INPUT CLOSE.
    

    由于文件布局未知,所有字段都被读取为字符。您需要添加一些逻辑来确定这些值是整数、小数、日期等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 2013-09-28
      • 2021-05-05
      相关资源
      最近更新 更多