Dzieki za odp ale nie do konca o to mi chodzilo. Sprobuje wyjaśnić lepiej.
Mam plik wejściowy w formie:
Kod:
SAR001, ,"Cimetrix, Inc",Bob Smith,CAM,N,8,1,0,7,"Error, Core Dumped"
SAR002, ,"Cimetr22, In2",Bob2Smith,CA2,2,2,2,2,2,"Error,2Core Dumped"
Natomiast forma pożądana przeze mnie to plik wyjściowy:
Kod:
"SAR001";"";"Cimetrix, Inc";"Bob Smith";"CAM";"N";"8";"1";"0";"7";"Error, Core Dumped";
"SAR002";"";"Cimetr22, In2";"Bob2Smith";"CA2";"2";"2";"2";"2";"2";"Error, 2Core Dumped";
Mam coś takiego:
Kod:
#!/usr/bin/perl
open(DANE, "$ARGV[0]") || die "$ARGV[0] not exist";
open(XXX, ">b-$ARGV[0]");
while ($txt = <DANE>)
{
@new = ();
push(@new, $+) while $txt =~ m{
"([^\"\\]*(?:\\.[^\"\\]*)*)",? # groups the phrase inside the quotes
| ([^,]+),?
| ,
}gx;
push(@new, undef) if substr($txt,-1,1) eq ',';
foreach my $val (@new) {
print XXX"\"$val\"\;";
}
}
Jednak otrzymuje:
Kod:
"SAR001";" ";"Cimetrix, Inc";"Bob Smith";"CAM";"N";"8";"1";"0";"7";"Error, Core Dumped";"
";"SAR002";" ";"Cimetr22, In2";"Bob2Smith";"CA2";"2";"2";"2";"2";"2";"Error,2Core Dumped";"
";
Wszystko ok z wyjatkiem tego ze ostatnia wartość jest ze znakiem konca lini przez co do kolejniej lini wskakuje mi "; .
Mysle ze teraz jest troche jasniej.
EDIT:
W przypadku gdy wartość ostatnia w lini jest w " " skrypt wyrzuca:
Kod:
"SAR001";" ";"Cimetrix, Inc";"Bob Smith";"CAM";"N";"8";"1";"0";"7";"Error,Core Dumped";"<EOL>
";"SAR002";" ";"Cimetr22, In2";"Bob2Smith";"CA2";"2";"2";"2";"2";"2";"Error,2Core Dumped";"<EOL>
";
Natomaist jezeli ostatnia wartość jest bez " " np.:
Kod:
SAR001, ,"Cimetrix, Inc",Bob Smith,CAM,N,8,1,0,7,Error,Core Dumped
SAR002, ,"Cimetr22, In2",Bob2Smith,CA2,2,2,2,2,2,Error,2Core Dumped
skrypt wyrzuca:
Kod:
"SAR001";" ";"Cimetrix, Inc";"Bob Smith";"CAM";"N";"8";"1";"0";"7";"Error";"Core Dumped<EOL>
";"SAR002";" ";"Cimetr22, In2";"Bob2Smith";"CA2";"2";"2";"2";"2";"2";"Error";"2Core Dumped<EOL>
";
Wydaje mi sie ze rozwiazaniem jest zastapienie "<EOL>"; na <EOL>
oraz <EOL>"; na ";<EOL>
niestety:
$val =~ s/\"\n\"\;/\n/m
to nie to.