从csv中删除不需要的逗号

时间:2015-12-02 22:04:00

标签: progress-4gl openedge

我正在编写一个Progress,OpenEdge,ABL以及其他所谓的程序。

我有一个用逗号分隔的CSV文件。但是,有一个“礼物消息”字段,用户输入带有“逗号”的消息,所以现在我的程序会因为那些不好的逗号而看到其他条目。

CSV字段不是双qoutes所以我不能只使用我的main方法

/** this next block of code will remove all unwanted commas from the data. **/
    if v-line-cnt > 1 then /** we won't run this against the headers. Otherwise thhey will get deleted **/
      assign
        v-data = replace(v-data,'","',"\t")  /** Here is a special technique to replace the comma delim wiht a tab **/
        v-data = replace(v-data,','," ")     /** now that we removed the comma delim above, we can remove all nuisance commas **/
        v-data = replace(v-data,"\t",'","'). /** all nuisance commas are gone, we turn the tabs back to commas. **/

有什么建议吗?

编辑:

从Progress,我调用Linux命令。所以我应该能够从我的Progress Program中执行所有C ++ / PHP / Shell等。我期待着建议,直到那时我将考虑使用外部脚本。

2 个答案:

答案 0 :(得分:2)

您没有提供足够的数据来获得完美答案,但考虑到您的意见,我认为IMPORT语句应该自动处理。

在我的示例中,commaimport.csv是一个以逗号分隔的csv文件,其中包含文本字段周围的引号。整数,逻辑变量等没有引号。最后一个字段在一行中包含逗号:

commaimport.csv
=======================
"Id1", 123, NO, "This is a message"
"Id2", 124, YES, "This is a another message, with a comma"
"Id3", 323, NO, "This is a another message without a comma"

要导入此文件,我定义了一个与文件布局匹配的临时表,并使用带逗号作为分隔符的IMPORT语句:

DEFINE TEMP-TABLE ttImport NO-UNDO
    FIELD field1 AS CHARACTER FORMAT "xxx"
    FIELD field2 AS INTEGER   FORMAT "zz9"
    FIELD field3 AS LOGICAL   
    FIELD field4 AS CHARACTER FORMAT "x(50)".

INPUT FROM VALUE("c:\temp\commaimport.csv").
REPEAT :
    CREATE ttImport.
    IMPORT DELIMITER "," ttImport.
END.
INPUT CLOSE.

FOR EACH ttImport:
    DISPLAY ttImport.
END.

您不必导入临时表。您可以改为导入变量。

DEFINE VARIABLE c AS CHARACTER   NO-UNDO FORMAT "xxx".
DEFINE VARIABLE i AS INTEGER     NO-UNDO FORMAT "zz9".
DEFINE VARIABLE l AS LOGICAL     NO-UNDO.
DEFINE VARIABLE d AS CHARACTER   NO-UNDO FORMAT "x(50)".

INPUT FROM VALUE("c:\temp\commaimport.csv").
REPEAT :
    IMPORT DELIMITER "," c i l d.
    DISP c i l d.
END.
INPUT CLOSE.

这将呈现基本相同的输出:

Progress console output

答案 1 :(得分:2)

您无法显示数据文件的外观。但如果有问题的字段是最后一个,并且没有引号,那么最好的选择可能是使用INPUT UNFORMATTED一次读取它,然后使用ENTRY()将行拆分为字段。这样你就可以将第n个逗号之后的所有内容视为单个字段,无论该行有多少逗号。

例如,假设您的输入文件有三列,如下所示:

boris,14.23,12 the avenue
mark,32.10,flat 1, the grange
percy,1.00,Bleak house, Dartmouth

...因此第三列是一个可能包含逗号的地址,并未用引号括起来,以便IMPORT DELIMITER无法为您提供帮助。

在这种情况下,像这样的东西会起作用:

/* ...skipping a lot of definitions here ... */

input from "datafile.csv".
repeat:
    import unformatted v-line.
    create tt-thing.
    assign tt-thing.name    = entry(1, v-line, ',')
           tt-thing.price   = entry(2, v-line, ',')
           tt-thing.address = entry(3, v-line, ',').

    do v=i = 4 to num-entries(v-line, ','):
        tt-thing.address = tt-thing.address 
                         + ','
                         + entry(v-i, v-line, ',').

    end.

end.
input close.