日安。
在此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文件的情况下删除此文件?
发布于 2017-08-23 17:38:21
删除文件末尾的空行并不能解决您的问题,更糟糕的是,如果您这样做了,您将无法使用IMPORT语句读取最后一个有效的CSV行(它需要在末尾有一个空行才能正常工作)。
实际问题是,您在表中得到了一个空行,因为当REPEAT块到达文件末尾时,IMPORT DELIMITER "," cTable.会失败,因为它会引发ENDKEY条件,从而离开循环。但是,由于您在循环结束之前调用了CREATE cTable.,因此会得到一个空条目。我希望这个解释能帮助你理解REPEAT循环是如何工作的,如果你不知道这一点,它看起来就像一个没有任何中断条件的无限循环。
无论如何,要解决这个问题,您可以删除空行(就像您之前所做的那样),这是完全有效的,或者您可以从临时表定义中省略NO-UNDO,因为这样REPEAT将在默认情况下对CREATE执行UNDO操作。
对于你的另一个关于CSV标题行的问题,你必须以某种方式读取该行,我不认为有一个语句可以跳过它,从文件中的2.行开始读取。如果需要标题名称,可以简单地为每一列定义一个char变量并导入它,如下所示:
IMPORT DELIMITER "," cColumn1 cColumn2. /* for every column */或者,如果您只想阅读并忽略它,您可以使用
IMPORT UNFORMATTED cTemp.使用读取整行的temp变量。
发布于 2017-08-23 22:03:53
如果您正在尝试导入未知的文件格式,您可能会尝试读取整行数据,然后选择各个字段。至于问题2,最好以编程方式处理不正确的数据,而不是试图更改文件本身。
此代码从文件中读取每一行,跳过任何为空或null的行。然后,它遍历该行中的每个逗号分隔字段并显示它们。
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.由于文件布局未知,因此所有字段都被读取为字符。您需要添加一些逻辑来确定值是否为整数、小数、日期等。
https://stackoverflow.com/questions/45834036
复制相似问题