I have created the following program to read a text file which happens to be a cobol filed definition. The program then outputs to a file what is essentially a file which is a list definition which I can later copy and past into a python program. I will eventually expand the program to also output an SQL script to create a SQL file in MySQL
The program still need a little work, it does not handle the following items yet; 1. It does not handle OCCURS yet. 2. It does not handle REDEFINE yet. 3. GROUP structures will need work. 4. Does not create SQL script yet. It is my anticipation that any files created out of this program may need manual tweeking but I have a large number of cobol file definitions which I may need to work with and this seemed like a better solution than hand typing each list definition and SQL create file script by hand. What I would like is if some kind soul could review my code and give me some suggestions on how I might improve it. I think the use of regular expression might cut the code down or at least simplify the parsing but I'm just starting to read those chapters in the book;) *** SAMPLE INPUT FILE *** 000100 FD SALESMEN-FILE 000200 LABEL RECORDS ARE STANDARD 000300 VALUE OF FILENAME IS "SALESMEN". 000400 000500 01 SALESMEN-RECORD. 000600 05 SALESMEN-NO PIC 9(3). 000700 05 SALESMEN-NAME PIC X(30). 000800 05 SALESMEN-TERRITORY PIC X(30). 000900 05 SALESMEN-QUOTA PIC S9(7) COMP. 001000 05 SALESMEN-1ST-BONUS PIC S9(5)V99 COMP. 001100 05 SALESMEN-2ND-BONUS PIC S9(5)V99 COMP. 001200 05 SALESMEN-3RD-BONUS PIC S9(5)V99 COMP. 001300 05 SALESMEN-4TH-BONUS PIC S9(5)V99 COMP. *** PROGRAM CODE *** #!/usr/bin/python import sys f_path = '/home/lenyel/Bruske/MCBA/Internet/' f_name = sys.argv[1] fd = open(f_path + f_name, 'r') def fmtline(fieldline): size = '' type = '' dec = '' codeline = [] if fieldline.count('COMP.') > 0: left = fieldline[3].find('(') + 1 right = fieldline[3].find(')') num = fieldline[3][left:right].lstrip() if fieldline[3].count('V'): left = fieldline[3].find('V') + 1 dec = int(len(fieldline[3][left:])) size = ((int(num) + int(dec)) / 2) + 1 else: size = (int(num) / 2) + 1 dec = 0 type = 'Pdec' elif fieldline[3][0] in ('X', '9'): dec = 0 left = fieldline[3].find('(') + 1 right = fieldline[3].find(')') size = int(fieldline[3][left:right].lstrip('0')) if fieldline[3][0] == 'X': type = 'Xstr' else: type = 'Xint' else: dec = 0 left = fieldline[3].find('(') + 1 right = fieldline[3].find(')') size = int(fieldline[3][left:right].lstrip('0')) if fieldline[3][0] == 'X': type = 'Xint' codeline.append(fieldline[1].replace('-', '_').replace('.', '').lower()) codeline.append(size) codeline.append(type) codeline.append(dec) return codeline wrkfd = [] rec_len = 0 for line in fd: if line[6] == '*': # drop comment lines continue newline = line.split() if len(newline) == 1: # drop blank line continue newline = newline[1:] if 'FILENAME' in newline: filename = newline[-1].replace('"','').lower() filename = filename.replace('.','') output = open('/home/lenyel/Bruske/MCBA/Internet/'+filename +'.fd', 'w') code = filename + ' = [\n' output.write(code) elif newline[0].isdigit() and 'PIC' in newline: wrkfd.append(fmtline(newline)) rec_len += wrkfd[-1][1] fd.close() fmtfd = [] for wrkline in wrkfd[:-1]: fmtline = str(tuple(wrkline)) + ',\n' output.write(fmtline) fmtline = tuple(wrkfd[-1]) fmtline = str(fmtline) + '\n' output.write(fmtline) lastline = ']\n' output.write(lastline) lenrec = filename + '_len = ' + str(rec_len) output.write(lenrec) output.close() *** RESULTING OUTPUT *** salesmen = [ ('salesmen_no', 3, 'Xint', 0), ('salesmen_name', 30, 'Xstr', 0), ('salesmen_territory', 30, 'Xstr', 0), ('salesmen_quota', 4, 'Pdec', 0), ('salesmen_1st_bonus', 4, 'Pdec', 2), ('salesmen_2nd_bonus', 4, 'Pdec', 2), ('salesmen_3rd_bonus', 4, 'Pdec', 2), ('salesmen_4th_bonus', 4, 'Pdec', 2) ] salesmen_len = 83 If you find this code useful please feel free to use any or all of it at your own risk. Thanks Len S -- http://mail.python.org/mailman/listinfo/python-list