我真的很亲密。我通读“number of space between each word”并确实提供了这一行:
counts = [(len(list(cpart))) for c,cpart in groupby(s) if c == ' ']
但我真的不明白......我明白了,或者我在假设,C是分隔符,S是你正在分组的,而你正在放置结果列表?(python,array是新的?)计数(S表示先前实例化的变量)
AMOUNT DATE
NAME ACCOUNT# DISCOUNT DUE DUE
我正在创建一个程序,允许我查看随机创建的COBOL输出文件头并使用它来创建PIC(X)的关联。
重要的部分是数字。我可以明确地确定字符串的长度,但是空间我不确定如何......
这是我到目前为止表明我正在工作lol:
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
答案 0 :(得分: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
是{{1}的所有连续值的迭代器}}。拨打c
后,它会显示len(cpart)
的列表(每个项目都相同!),该列表的长度是字符[c,c,c,...]
重复的次数。通常它只是一个。例如,对于c
中的'A'
,您将获得'NAME
和c == A
。但对于list(cpart) == ['A']
和NAME
之间的空格,您将获得ACCOUNT#
和c == ' '
。
整个内部括号cpart == [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ']
意味着它生成一个列表,好像您要附加到[]
循环中的列表一样,每个项的值是{{{}之前的表达式1}}。这里,它是for
,它计算一个字符的重复实例列表的长度。因此,它将是一个列表,其中包含重复字符的次数。 for
表示只有当该字符是空格时才会将项目添加到列表中。
以上将计算空格。要计算单词(例如,要获得PIC X(6)VALUE“AMOUNT”),您可以执行以下操作:
len(list(cpart))
其中if c == ' '
(您已使用过)返回一个单词列表,这些单词之前是一个以空格分隔的字符串。
答案 1 :(得分:0)
像这样分解输出没有特别的意义。你好吗:
05 FILLER (optional) PIC X(width-of-report) VALUE
" AMOUNT DATE "(in column 72)
- ".
“ - ”位于第7列,显示字母数字文字的延续,不需要开头报价,但需要结束报价。
您创建的处理非常简单。你总是输出这三行,你要做的就是将你的数据“切”成59字节(第二行)和第三行的“其余”(不知道你的报告宽度)。