converting pipe delimited file to fixed width

D

digz

Hi,
I am trying to convert a | delimited file to fixed width by right
padding with spaces, Here is how I have written the program , just get
the feeling this can be done in a much better ( python functional )
way rather than the procedural code i have below . Any help
appreciated

#!/usr/bin/python
def rightFill(fillString, toLength, fillChar):
return fillString+''.join([fillChar for x in range(len
(fillString),toLength)])

fieldWidth=[ 14, 6, 18, 21, 21,4, 6 ];

file = open("/home/chatdi/input.csv", "r");
lines = file.readlines()
file.close()

out = open( "/home/chatdi/ouptut.csv", 'w')
for line in lines:
line = line[:-1]
index = 0
for token in line.split('|'):
paddedToken = rightFill(token, fieldWidth[index], ' ' )
out.write( paddedToken )
index = index + 1
out.write("\n")
 
M

MRAB

digz said:
Hi,
I am trying to convert a | delimited file to fixed width by right
padding with spaces, Here is how I have written the program , just get
the feeling this can be done in a much better ( python functional )
way rather than the procedural code i have below . Any help
appreciated

#!/usr/bin/python
def rightFill(fillString, toLength, fillChar):
return fillString+''.join([fillChar for x in range(len
(fillString),toLength)])

fieldWidth=[ 14, 6, 18, 21, 21,4, 6 ];

file = open("/home/chatdi/input.csv", "r");
lines = file.readlines()
file.close()

out = open( "/home/chatdi/ouptut.csv", 'w')
for line in lines:
line = line[:-1]
index = 0
for token in line.split('|'):
paddedToken = rightFill(token, fieldWidth[index], ' ' )
out.write( paddedToken )
index = index + 1
out.write("\n")
Here's my version:

#!/usr/bin/python

field_widths = [14, 6, 18, 21, 21, 4, 6]

out = open("/home/chatdi/ouptut.csv", 'w')
for line in open("/home/chatdi/input.csv", "r"):
fields = line.rstrip().split('|')
padded_fields = [field.ljust(width) for field, width in zip(fields,
field_widths)]
out.write("".join(padded_fields) + "\n")

out.close()
 
O

odeits

Hi,
I am trying to convert a | delimited  file to fixed width by right
padding with spaces, Here is how I have written the program , just get
the feeling this can be done in a much better ( python functional )
way rather than the procedural code i have below . Any help
appreciated

#!/usr/bin/python
def rightFill(fillString, toLength, fillChar):
    return fillString+''.join([fillChar for x in range(len
(fillString),toLength)])

fieldWidth=[ 14, 6, 18, 21, 21,4, 6  ];

file = open("/home/chatdi/input.csv", "r");
lines = file.readlines()
file.close()

out = open( "/home/chatdi/ouptut.csv", 'w')
for line in lines:
    line = line[:-1]
    index = 0
    for token in line.split('|'):
        paddedToken = rightFill(token, fieldWidth[index], ' ' )
        out.write( paddedToken )
        index = index + 1
    out.write("\n")


Caveat: none of the solutions (including mine) deal with the case of
the field being longer than the width. You might want to throw an
exception.

I use the csv module to do the reading of the file, i am going to do
some testing to see if i can set the delimiter to '' so that i can
also use it for the output. For now this should work.


http://docs.python.org/library/csv.html


import csv

fieldWidth=[ 14, 6, 18, 21, 21,4, 6 ];
csvfilepath = 'somefile.csv'

outcsvfilepath = 'someoutfile.csv'
endl = '\n'

f = open(csvfilepath)
outf = open(outcsvfilepath)


csvfile = csv.reader(f,delimiter = '|')

for row in csvfile:
outrow = [ field + fillchar * (width - len(field)) for width, field
in zip(fieldWidth,row)]
outcsv.write( ''.join(outrow))
outcsv.write( endl )

f.close()
outf.close()
 
T

Terry Reedy

digz said:
Hi,
I am trying to convert a | delimited file to fixed width by right
padding with spaces, Here is how I have written the program , just get
the feeling this can be done in a much better ( python functional )
way rather than the procedural code i have below . Any help
appreciated

#!/usr/bin/python
def rightFill(fillString, toLength, fillChar):
return fillString+''.join([fillChar for x in range(len
(fillString),toLength)])

Ugh. That should be the same as
return fillString + (toLength-length(fillString))*fillChar
 
M

MRAB

Terry said:
digz said:
Hi,
I am trying to convert a | delimited file to fixed width by right
padding with spaces, Here is how I have written the program , just get
the feeling this can be done in a much better ( python functional )
way rather than the procedural code i have below . Any help
appreciated

#!/usr/bin/python
def rightFill(fillString, toLength, fillChar):
return fillString+''.join([fillChar for x in range(len
(fillString),toLength)])

Ugh. That should be the same as
return fillString + (toLength-length(fillString))*fillChar
Ugh. That should be the same as
return fillString.ljust(toLength, fillChar)

(and there's no function length()) ;-)
 
T

Tim Chase

Caveat: none of the solutions (including mine) deal with the case of
the field being longer than the width. You might want to throw an
exception.

Alternatively, you can just crop the results. Tweaking MRAB's
elegant solution:

field_widths = [14, 6, 18, 21, 21, 4, 6]
infile = open("input.csv")
out = open("ouptut.csv", 'w')

for fields in csv.reader(infile, delimiter='|'):
padded_fields = [
# pad, and then crop
field.ljust(width)[:width]
for field, width
in zip(fields, field_widths)
]
out.write("".join(padded_fields) + "\n")

infile.close()
out.close()

If you want them right-justified, you can use

field.rjust(width)[-width:]

-tkc
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,819
Latest member
masterdaster

Latest Threads

Top