2

テキスト ファイルから CSV を解析する際に問題が発生しました。サポートしていただけるかどうかを考えていました。これまでのところ、次のものがあります。

CSV ファイル (DATA.txt) は次のようになります。常に 15 個のフィールドがすべてコンマで区切られています。すべてのフィールドが必須ではないため、一部は入力され、一部は空白になります。

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コードです

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 のどちらを使用すべきか、または最初の 2 行を正しく記述したかどうかがわかりません。「CITY」が入力されているが、解析された値が取得されていないため、CREATEDATA関数が正しく機能することは事実です。どんな助けでも大歓迎です。ありがとうございました!

4

2 に答える 2

1

if A=2 then の目的は何ですか?

IF A=2 THEN DO COUNTER=1 TO LINES(SOURCEFILE)

A != 2 の場合、ループはバイパスされます。あなたのプログラムは次のようにすべきだと思います:

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 - プロシージャ コールの引数 pull - スタックから取り出されたデータ var - データは変数値から取得されます ... データはインラインで提供されます

したがって、解析は次のように行うことができます

   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

また

    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

最後に ass ross は、ファイル全体を読み取る必要があるため、行(ソースファイル) を試してみるべきだと言いました。

于 2013-04-11T00:26:10.993 に答える
1

いくつかのコメント:

1) Lines(SourceFile)Windows システムでは、おそらくファイル全体を読み取って CR-LF シーケンスをカウントする必要があります。次に、Parse value LineIn(SourceFile)ループはそれを再度読み取ります。これを行う典型的な Rexx の方法は次のとおりです。

Address SYSTEM 'TYPE' SourceFile with output stem Lines.
Do Counter = 1 to Lines.0
    Parse var Lines.Counter ...
End
Drop Lines.

少なくとも、ファイルが大きすぎない限り、ファイルを配列に保持するとメモリのコストが高くなります。

2) ループの最後で に流れ込んCreateDataでいるため、「CITY」が表示されています。その命令の後にReturnorが必要です。ExitEnd

Parse3)#2に照らして、が初期化されていないため、が実行されていないことは明らかですCity(Rexxの初期化されていない変数の値は大文字の名前です)。の条件付きですがA=2、そうであってはなりません。

于 2013-04-10T21:34:56.483 に答える