2011-05-24 30 views
0

我正在讀取一個可變長度輸入文件,並希望創建一個輸出緩衝區(索引表),該輸出緩衝區將不會利用字符移動的字符。COBOL數據緩衝而不移動字符

例如:我的第一個輸入記錄是79個字符,然後我可以將它移動到我的表的組級別。我的第二個輸入記錄是101個字符 - 我怎樣才能把這101個字符放在我的桌子上,從第80位開始,長度爲101?下一個輸入記錄從180開始......等等。我們目前執行的變化是1,但是與塊移動到起始地址相比,這是CPU密集型的難以置信的。

我們每天這樣做數百萬次,解決方案將非常有用。

+0

也許你可以詳細說明你在這個文件中有多少種不同的記錄類型? – 2011-05-25 12:26:24

回答

2

使用參考修改與您記錄的長度。試想一下:

01 Record 
    05 Rec-LL Pic S9(4) Binary. 
    05 Rec-Data Pic X(32767). 
01 Tgt-Area Pic X(10000000). 
01 Curr-Ptr Pic S9(8) Binary. 

一旦你讀你的記錄,你可以移動基於像這樣的長度:

Move 1 to Curr-Ptr 
    Perform Get-Next-Record 
    Perform until no-more-data 
     Move Rec-Data (1:Rec-LL) to Tgt-Area (curr-ptr:rec-LL) 
     Compute Curr-Ptr = Curr-Ptr + Rec-LL 
     Perform Get-Next-Record 
    End-Perform 
0

還是老式的(我們所說的COBOL這裏這麼老土=侏羅紀)的方式: -

01 Record. 
     05 REC-LL   PIC S9(4) Binary. 
     05 REC-DATA. 
      10 REC-BYTES PIC X OCCURS 32767 times depending on REC-LL. 

    01 TARGET-AREA. 
     05 TARGET-HEADER  PIC X(79). 
     05 TARGET-REC   PIC X(101) OCCURS 50 TIMES. 

    01 TGT-INDEX    PIC S9(8) BINARY VALUE 1. 

    * Length calculation happens by magic! 

     Perform Read-Record. 
     move REC-DATA TO TARGET-HEADER. 
     perform until no-more-data 
      Perform Read-Record 
      move REC-DATA to TARGET-RED(TGT-INDEX) 
      add +1 to TGT-INDEX 
     end-perform 

或者,如果真的記錄變化1和101之間的字節:

01 Record. 
     05 REC-LL   PIC S9(4) Binary. 
     05 REC-DATA. 
      10 REC-BYTES PIC X OCCURS 32767 times depending on REC-LL. 

    01 TARGET-AREA. 
     05 TGT-LL    PIC s9(8) BINARY. 
     05 TGT-REC. 
      10 TGX-BYTE  OCCURS 3175 depending on TGT-LL. 
     05 TGT-EXTRA   PIC X(101). 




     Perform Read-Record. 
     Move +0 to tgt-LL. 
     perform until no-more-data 
      MOVE REC-DATE to TGT-EXTRA 
      ADD REC-LL TO TGT-LL 
      Perform Read-Record 
      add +1 to TGT-INDEX 
     end-perform 
+0

這不允許可變長度記錄。 OP很清楚,有些將是79個字節,其他將是101個字節。 – 2011-05-25 12:23:18

+0

我讀過這篇文章,第一個記錄是79,其他所有的101個字節。可能已經讀錯了! – 2011-05-26 01:49:34

+0

@Joe - 添加了第二個變體,但如果「[1:n]」字符下標不可用,則內聯執行可能不可用! – 2011-05-27 02:24:47

0

查看STRING INTO動詞,特別是WITH POINTER子句。不要忘記將這些事情串在一起時的ON OVERFLOW命令。

有關詳細信息,請獲取Gary Cutler的OpenCOBOL程序員指南的副本。

http://opencobol.add1tocobol.com/OpenCOBOL%20Programmers%20Guide.pdf

這是一個世界級的COBOL手冊,它是一個開放和自由文檔(GNU FDL)。