Há algumas coisas complicadas com o CSV: um campo contém um separador de campo incorporado ou um campo contém cotações incorporadas. Eu adicionei 2 linhas aos seus dados de amostra:
TEST_AB.foo " with "embedded quotes" here
TESTRICU=L.foo " with an inner; semicolon
E uma solução assustadora de perl é: salve isso em um arquivo chamado "text2csv.sh"
#!/bin/sh
perl -lne '
@F = split /\s*"\s*/, $_, 2;
($record, $field) = split /\./, $F[0];
$fields{$field} = 1;
$records{$record} = 1;
$data{$record}{$field} = $F[1];
} END {
print join ";", "RECORDNAME", keys %fields;
for my $rec (keys %records) {
print join";", $rec, map {
$q=0;
if (/"/) {s/\"/\"\"/g; $q=1}
if (/;/) {$q=1}
$q ? qq{"$_"} : $_
} @{$data{$rec}}{keys %fields};
}
' "$1" > "$1.csv"
E corra assim:
sh text2csv.sh /path/to/myfile.txt
cat /path/to/myfile.txt.csv
RECORDNAME;PERATIO;NAVALUE_1;ISSUE_PRC;BCKGRNDPAG;GEN_VAL2;SPARE_NM2;GEN_VAL3;COUPN_RATE;DSPLY_NAME;CLOSE_BID;NAVALUE;VALOREN_NO;TRDTIM_1;PRTY_PRICE;ISSUE_DATE;RECORDTYPE;OFFCL_CODE;MID_PRICE;BID;TRDPRC_1;ASK;ACTIV_DATE;STRIKE_PRC;HSTCLSDATE;ASK_YIELD;MATUR_DATE;NAV_NETCHN;NAVDATE;PCTCHNG;TRADE_DATE;BIDSIZE;NAVDAT_1;ASKSIZE;MKT_MKR_NM;foo;OPEN_PRC;NETCHNG_1;BID_YIELD;RDNDISPLAY;YIELD;CURRENCY;TIMACT;GEN_VAL1;HST_CLOSE;PUTCALLIND;CLOSE_ASK;SPARE_NM3;BOND_TYPE;SPARE_NM1;SETTLEDATE;EUROCLR_NO;GEN_VAL4;CEDEL_NO
TESTRICU=L;;;;;;;;+4;TEST;;;100;;;01 Jan 2004;;1003;;;;0;;;;;31 Dec 1906;;;;;;;;;"with an inner; semicolon";;;;;;GBP;;;;;;;;;;;;
TEST_AB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"with ""embedded quotes"" here";;;;;;;;;;;;;;;;;;