我正在编写一个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等。我期待着建议,直到那时我将考虑使用外部脚本。
答案 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.
这将呈现基本相同的输出:
答案 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.