1

私は本当に近くにいます。「各単語間のスペース数」を読んだところ、次の行が表示されます。

counts = [(len(list(cpart))) for c,cpart in groupby(s) if c == ' ']

しかし、私は本当にそれを理解していません...私は理解しているか、Cが区切り文字であり、Sがあなたがグループ化しているものであり、結果のリストを入れていますか?カウント (S は以前にインスタンス化された変数を参照します)

このようなものをどのように判断しますか?

                                                  AMOUNT       DATE       
   NAME          ACCOUNT#         DISCOUNT         DUE         DUE

ランダムに作成された COBOL 出力ファイル ヘッダーを確認し、それを使用して関連する PIC(X) を作成できるプログラムを作成しています。

ソリューションの出力例は次のとおりです。

  1. PIC X(30) 値スペース。
  2. PIC X(6) 値「金額」。
  3. PIC X(8) 値スペース。
  4. PIC X(4) 値「日付」。

重要な部分は数字です。文字列の長さは明らかに判断できますが、スペースについてはどうすればよいかわかりません...

これが私がこれまでに働いていることを示すために持っているものです笑:

from itertools import groupby
from test.test_iterlen import len
from macpath import split
from lib2to3.fixer_util import String

file = open("C:\\Users\\Joshua\\Desktop\\Practice\\cobol.cbl", 'r+')

line1 = file.readline()
split = line1.split()
print (split)
print ()

counts = [(len(list(cpart))) for c,cpart in groupby(split) if c == ' ']

print (counts)


index = 0
while index != split.__len__():
    if split[index].strip() != None:
        print ("PICX(" + ") VALUE " + "\"" + split[index] + "\".")
    elif counts[index] == None:
        print ("PICX(" + ") VALUE " + "\"" + split[index] + "\".") 
    index+=1
4

2 に答える 2

3

最初の行の説明から始めます。

counts = [(len(list(cpart))) for c,cpart in groupby(s) if c == ' ']

s実際には入力文字列です。したがって、これを実行するには、次から始めます。

s = "   NAME          ACCOUNT#         DISCOUNT         DUE         DUE"

groupby(s)タプルの反復子を返します。そのタプルの最初の値は入力文字列の文字で、2 番目の値は文字の繰り返される値を反復処理する別の (ネストされた) イテレータです。(説明のために)フォームに入れるlistと、次のようになります。

groupby("hello!!!")
[('h', ['h']), ('e', ['e']), ('l', ['l', 'l']), ('o', ['o']), ('!', ['!', '!', '!'])]

したがって、cは区切り文字ではありませんが、文字列 の各文字を保持する変数でありscpartの連続するすべての値の反復子ですc。呼び出すlen(cpart)[c,c,c,...](各項目は同じです!) のリストが返され、そのリストの長さは文字cが繰り返される回数です。通常は 1 つだけになります。たとえば、'A'in 'NAME' の場合、 and が得られc == Aますlist(cpart) == ['A']。しかし、 と の間のスペースについてはNAMEACCOUNT#と が得られc == ' 'ますcpart == [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ']

全体が括弧内にあるということは、ループ[]内でリストに追加しているかのようにリストを生成し、各項目の値が . の前の式であることを意味します。ここでは、文字の繰り返しインスタンスのリストの長さをカウントするのは です。したがって、文字が繰り返される回数のリストになります。は、その文字がスペースの場合にのみ項目がリストに追加されることを意味します。forforlen(list(cpart))if c == ' '


上記はスペースをカウントします。単語を数えるには (たとえば、PIC X(6) VALUE "AMOUNT" を取得するには)、次のようにするだけです。

word_counts = [ len(word) for word in s.split() ]

where split(使用したもの)は、以前はスペースで区切られた1つの文字列だった単語のリストを返します。

于 2013-03-13T03:30:39.823 に答える
0

このように出力を分割することに特に意味はありません。次のことができます。

     05  FILLER (optional) PIC X(width-of-report) VALUE
     "                              AMOUNT        DATE             "(in column 72)
-                         ".

「-」は 7 列目にあり、英数字リテラルの継続を示します。開始引用符は必要ありませんが、終了引用符が必要です。

それを作成するための処理は非常に簡単です。常にこれらの 3 行を出力します。必要なのは、データを 59 バイト (2 行目) に「切り刻む」ことと、3 行目を (レポートの幅がわからない) 「残り」にすることだけです。

于 2013-03-13T14:47:53.500 に答える