首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >REXX -从CSV文件解析

REXX -从CSV文件解析
EN

Stack Overflow用户
提问于 2013-04-11 02:57:27
回答 2查看 1.8K关注 0票数 2

我在从文本文件中解析CSV时遇到了问题,不知道你们是否可以帮助我。到目前为止,我有以下几点:

CSV文件(DATA.txt)看起来像这样,它总是有15个字段,全部用逗号分隔。并非所有字段都是必填字段,因此一些字段将被填写,而另一些字段则为空。

代码语言:javascript
复制
Seattle,Lastname,Firstname,DOB,SEX,etc,etc
Seattle,Lastname,Firstname,DOB,,etc,etc
Portland,Lastname,Firstname,DOB,SEX,,,etc
Portland,Lastname,Firstname,DOB,SEX,etc,etc

这是我的REXX代码

代码语言:javascript
复制
SOURCEFILE = "C:\DATA\DATA.TXT"
IF A=2 THEN DO COUNTER=1 TO LINES(SOURCEFILE)
    PARSE VALUE LINEIN(SOURCEFILE) WITH CITY "," LAST_NAME "," FIRST_NAME "," MOM_NAME "," MIDDLE_NAME "," DAD_NAME "," DOB "," etc "," etc "," etc "," etc "," SEX "," etc "," etc
    CALL SETCURSOR 4,23
    CALL CREATEDATA
END

CREATEDATA:
CALL TYPE CITY
CALL PRESS TAB
CALL TYPE LAST_NAME
CALL PRESS TAB
CALL TYPE DATE(U)
CALL PRESS TAB
CALL TYPE FIRST_NAME
CALL PRESS TAB
CALL PRESS ENTER
RETURN

我不确定我应该在解析时使用ARG还是VAR,或者我是否正确地写了前两行。我知道我的CREATEDATA函数工作正常,因为我得到的是输入的“城市”,而不是解析后的值。任何帮助都将不胜感激。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2013-04-11 05:34:56

下面是一些评论:

1) Windows系统上的Lines(SourceFile)可能涉及读取整个文件来计算CR-LF序列。然后,您的Parse value LineIn(SourceFile)循环再次读取它。典型的Rexx方法是:

代码语言:javascript
复制
Address SYSTEM 'TYPE' SourceFile with output stem Lines.
Do Counter = 1 to Lines.0
    Parse var Lines.Counter ...
End
Drop Lines.

至少,只要文件不是太大以至于在数组中保存它会占用大量内存。

2)你在循环的末尾进入了CreateData,这就是为什么你会看到“城市”。在该End指令后面需要一个ReturnExit

3)根据#2,很明显Parse永远不会被执行,因为City是未初始化的( Rexx中未初始化变量的值是它的大写名称)。它是以A=2为条件的,不能是这样的。

票数 1
EN

Stack Overflow用户

发布于 2013-04-11 08:26:11

一个问题是if A=2 then in的用途是什么?

代码语言:javascript
复制
IF A=2 THEN DO COUNTER=1 TO LINES(SOURCEFILE)

如果A != 2,则绕过循环。我怀疑你的程序应该是:

代码语言:javascript
复制
SOURCEFILE = "C:\DATA\DATA.TXT"
DO COUNTER=1 TO LINES(SOURCEFILE) 
    PARSE VALUE LINEIN(SOURCEFILE) WITH CITY "," LAST_NAME "," FIRST_NAME "," MOM_NAME "," MIDDLE_NAME "," DAD_NAME "," DOB "," etc "," etc "," etc "," etc "," SEX "," etc "," etc
    CALL SETCURSOR 4,23
    CALL CREATEDATA
END

RETURN   /* prevent the fall through to createdata */

CREATEDATA:




---------------------------

parse语句具有以下基本格式

解析源

其中源冰块

arg -过程调用的参数-从堆栈中拉出的数据var - data来自变量值...使用内联提供的数据

因此您的解析可以像这样完成

代码语言:javascript
复制
   linein = LINEIN(SOURCEFILE)
   PARSE var linein CITY "," LAST_NAME "," FIRST_NAME "," MOM_NAME "," MIDDLE_NAME "," DAD_NAME "," DOB "," etc "," etc "," etc "," etc "," SEX "," etc "," etc

代码语言:javascript
复制
    DO COUNTER=1 TO LINES(SOURCEFILE) 
        CALL SETCURSOR 4,23
        CALL CREATEDATA LINEIN(SOURCEFILE)
    END

    RETURN   /* prevent the fall through to createdata */

    CREATEDATA:
    parse arg CITY "," LAST_NAME "," FIRST_NAME "," MOM_NAME "," MIDDLE_NAME "," DAD_NAME "," DOB "," etc "," etc "," etc "," etc "," SEX "," etc "," etc

最后,罗斯说,你应该尽量避免行(源文件),因为它涉及到读取整个文件

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15934148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档