1

我真的很亲近。我通读了“每个单词之间的空格数”,它确实提供了这一行:

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

但我真的不明白......我明白,或者我假设,C 是分隔符,S 是你分组的依据,你把结果列表?(python 的新手,数组?)放入计数(S 指的是先前实例化的变量)

我将如何确定这样的事情?

                                                  AMOUNT       DATE       
   NAME          ACCOUNT#         DISCOUNT         DUE         DUE

我正在创建一个程序,它允许我查看随机创建的 COBOL 输出文件头并使用它来创建 PIC(X) 的关联。

示例解决方案输出为:

  1. 图 X(30) 价值空间。
  2. 图 X(6) 值“金额”。
  3. 图 X(8) 价值空间。
  4. 图 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)返回元组的迭代器。该元组中的第一个值是输入字符串中的字符,第二个值是另一个(嵌套)迭代器,它将遍历字符的重复值。输入list形式(用于说明)它看起来像这样:

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

所以,c不是分隔符,而是保存字符串中每个字符的变量s,并且cpart是遍历所有连续值的迭代器c。一旦你调用len(cpart)它,它就会给出一个列表[c,c,c,...](每个项目都是相同的!),该列表的长度是字符c重复的次数。通常它只会是一个。例如,对于'A'in 'NAME' 你会得到c == Aand list(cpart) == ['A']NAME但是对于and之间的空格ACCOUNT#,你会得到c == ' 'and cpart == [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ']

括号内的整个内容[]意味着它会生成一个列表,就好像您在for循环中附加到列表一样,并且每个项目的值是for. 在这里,它len(list(cpart))计算字符重复实例列表的长度。因此,它将是一个包含字符重复次数的列表。这if c == ' '意味着仅当该字符为空格时,该项目才会添加到列表中。


以上将计算空格。要计算单词(例如,要获得 PIC X(6) VALUE "AMOUNT"),您可以简单地执行以下操作:

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

where split(你已经使用过)返回一个单词列表,这些单词以前是一个由空格分隔的字符串。

于 2013-03-13T03:30:39.823 回答
0

像这样分解输出没有特别的意义。你可以:

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

“-”在第 7 列,表示字母数字文字的延续,不需要开引号,但需要闭引号。

您的创建过程非常简单。你总是输出这三行,你所要做的就是把你的数据“砍”成 59 个字节(第二行)和“其余的”(不知道你的报告宽度)第三行。

于 2013-03-13T14:47:53.500 回答