Given the variety of non-standard things (stray characters, lines you aren't interested in, two-line column headings, etc.), I don't think you can avoid running regexen to clean up the file. My advice would be to do this in two steps 1) do your slurping and cleaning such that you come out with a valid fixed-width flat file 2) use
AnyData or
DBD::AnyData to make the CSV file. These modules handle both fixed-width and CSV formats so you'd simply loop through the cleaned up file, letting AnyData convert fields and records from one format to fields and records in the other.