use strict; use Data::Dumper; my $SEPARATOR = ';'; my $SCREEN = '"'; # qr/\s*"\s*/; local $\ = "\n"; open my $VH, '>', \(my $result); while () { chomp; my $t; foreach (split /$SEPARATOR/) { # /\s* $SEPARATOR \s*/x /^ $SCREEN .* [^ $SCREEN ] $/x ? push @$t, $_ : /^ [^ $SCREEN ] .* $SCREEN $/x ? print($VH join $SEPARATOR, @{$t||[]}, $_) && undef $t : $t ? push @$t, $_ : print $VH $_ ; } print $VH join $SEPARATOR, @$t if $t; # trash print $VH $\; } print $result; __END__ №;"Наименован\"ие то;ва;ра";;"Кол.мест";"Ед.изм.";"Длина 1";"Длина 2";"Длина 3";"Длина,всего"; №;Наименован\"ие то;ва;ра;;"Кол.мест";"Ед.изм.";"Длина 1";"Длина 2";"Длина 3";"Длина,всего"; №;"Наименован\"ие то;ва;ра;;"Кол.мест";"Ед.изм.";"Длина 1";"Длина 2";"Длина 3";"Длина,всего"; "sta"";""mp;"type";"shit" "sta\"";\"\"mp;"type";"shit"