whoops, there was a doubled-up unprotected call to column_map.transform in there
handle blank lines better: check whether they're blank before the transform runs.  Also allow blank lines before the header