Добрый день, Спасибо, за помощь! -- Специалист IT, GNU, FLOSS, Open Source Моб: +7 (951) 131 33 90 С уважением, Кузьменко Константин Викторович
06.04.2015, 00:37, "Nikolay Mishin" <[email protected]>: > Костя, у меня получилось вот так: > > #!/usr/bin/perl > use strict; > use warnings; > use utf8; > use Modern::Perl; > use IO::Interactive qw(is_interactive); > use Encode::Locale qw(decode_argv); > use Text::CSV; > > &prepare_encoding_console(); > > my $csv = Text::CSV->new( > { > binary => 1, > auto_diag => 1, > sep_char => '|', > allow_whitespace => 1, > } > ); > my $file = $ARGV[0] or die "Need to get CSV file on the command line\n"; > my @result = (); > open( my $data, '<:encoding(utf8)', $file ) > or die "Could not open '$file' $!\n"; > > while ( my $fields = $csv->getline($data) ) { > push @result, ( join( ';', @{$fields}[ 1, 3 .. 5, 2 ] ) . ';' ); > } > if ( not $csv->eof ) { > $csv->error_diag(); > } > close $data; > print join( "\n", @result ); > > sub prepare_encoding_console { > if ( is_interactive() ) { > binmode STDIN, ':encoding(console_in)'; > binmode STDOUT, ':encoding(console_out)'; > binmode STDERR, ':encoding(console_out)'; > } > Encode::Locale::decode_argv(); > return 1; > } > > https://github.com/mishin/presentation/blob/master/gen_csv.pl > > исходный файл > https://github.com/mishin/presentation/blob/master/test.txt > запускать так > > perl gen_csv.pl test.txt > 12345678901234567890;ФАМИЛИЯ;ИМЯ;ОТЧЕСТВО;760.00; > 12345678901234567890;ФАМИЛИЯ1;ИМЯ1;ОТЧЕСТВО;760.00; > > 05.04.2015, 23:40, "Кузьменко Константин" <[email protected]>: >> Вот так "/\s*\|\s*/" удаляются пробелы и "\n" и тд и тп но мне же надо >> оставить "\n" в конце строки >> Подходит это: >> $_ =~ s/\h+//g; >> $_ =~ s/\|/;/g; >> Вопрос как удалить столбци >> >> -- >> Специалист IT, GNU, FLOSS, Open Source >> Моб: +7 (951) 131 33 90 >> С уважением, >> Кузьменко Константин Викторович >> >> 05.04.2015, 23:24, "Ilya Chesnokov" <[email protected]>: >>> 5 апреля 2015 г., 23:14 пользователь Кузьменко Константин >>> <[email protected]> написал: >>>> Это файл TXT >>>> 123 | 12345678901234567890 | 760.00 |ФАМИЛИЯ |ИМЯ >>>> |ОТЧЕСТВО |123456|222|888|9|RU|00007| >>>> На Выходе должен получиться CSV >>>> 12345678901234567890;ФАМИЛИЯ;ИМЯ;ОТЧЕСТВО;760.00; >>> Это вообще проще без регулярок делать. А банальным split-ом (с >>> минимальной регуляркой вида /\s*|\s*/) и join-ом (ну или при помощи >>> модуля Text::CSV). >>>> -- >>>> Специалист IT, GNU, FLOSS, Open Source >>>> Моб: +7 (951) 131 33 90 >>>> С уважением, >>>> Кузьменко Константин Викторович >>>> >>>> 05.04.2015, 18:16, "Иван Миронов" <[email protected]>: >>>>> Константин, Добрый день! >>>>> >>>>> Попробуйте уменьшить жадность квантификаторов добавив после знаков >>>>> звездочки вопросительный знак. >>>>> >>>>> s/^(.*?;).*?;.*?;.*?;.*?;.*?;(.*?;.*?;.*?;.*?;.*?;.*?;)$//g; >>>>> >>>>> Если не получится, я думаю было бы здорово если бы вы приложили >>>>> пример исходных данных для этого регулярного выражения. >>>>> >>>>> воскресенье, 5 апреля 2015 г. пользователь Алексей Мышкин написал: >>>>>> Есть подозрение что жадный квантификатор берёт всё что может, и >>>>>> строке за скобками уже ничего не остаётся. >>>>>> >>>>>> 5 апреля 2015 г., 15:42 пользователь Кузьменко Константин >>>>>> <[email protected]> написал: >>>>>>> Добрый день Moscow.pm >>>>>>> Не могу понять регулярки перл! >>>>>>> >>>>>>> #!/usr/bin/perl >>>>>>> >>>>>>> use strict; >>>>>>> use warnings; >>>>>>> use utf8; >>>>>>> use open qw/ :encoding(utf8) :std /; >>>>>>> #use open qw/ :encoding(cp1251) :std /; >>>>>>> >>>>>>> my @onfil = @ARGV; >>>>>>> open(INFIL, "<:encoding(cp866)", $onfil[0]) >>>>>>> or die "NO STANDART $!"; >>>>>>> >>>>>>> while (<INFIL>) { >>>>>>> $_ =~ s/\h+//g; >>>>>>> $_ =~ s/\|/;/g; >>>>>>> $_ =~ s///g; >>>>>>> $_ =~ s/^(.*;).*;.*;.*;.*;.*;(.*;.*;.*;.*;.*;.*;)$//g; # Не >>>>>>> удаляется в скобках >>>>>>> print; >>>>>>> } >>>>>>> >>>>>>> close INFIL; >>>>>>> >>>>>>> __END__ >>>>>>> >>>>>>> Может что нибудь посоветуете >>>>>>> зы: Z yjdbxjr d Зукл >>>>>>> -- >>>>>>> Специалист IT, GNU, FLOSS, Open Source >>>>>>> Моб: +7 (951) 131 33 90 >>>>>>> С уважением, >>>>>>> Кузьменко Константин Викторович >>>>>>> >>>>>>> -- >>>>>>> Moscow.pm mailing list >>>>>>> [email protected] | http://moscow.pm.org >>>>>> -- >>>>>> С уважением, >>>>>> Мышкин Алексей. >>>>> -- >>>>> С уважением, Миронов Иван! >>>>> тел.: +7 (926) 206-90-39 >>>>> >>>>> , >>>>> >>>>> -- >>>>> Moscow.pm mailing list >>>>> [email protected] | http://moscow.pm.org >>>> -- >>>> Moscow.pm mailing list >>>> [email protected] | http://moscow.pm.org >>> -- >>> Best regards, >>> Ilya Chesnokov >>> -- >>> Moscow.pm mailing list >>> [email protected] | http://moscow.pm.org >> -- >> Moscow.pm mailing list >> [email protected] | http://moscow.pm.org > -- > С уважением > Николай Мишин > > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org -- Специалист IT, GNU, FLOSS, Open Source Моб: +7 (951) 131 33 90 С уважением, Кузьменко Константин Викторович 06.04.2015, 00:37, "Nikolay Mishin" <[email protected]>: > Костя, у меня получилось вот так: > > #!/usr/bin/perl > use strict; > use warnings; > use utf8; > use Modern::Perl; > use IO::Interactive qw(is_interactive); > use Encode::Locale qw(decode_argv); > use Text::CSV; > > &prepare_encoding_console(); > > my $csv = Text::CSV->new( > { > binary => 1, > auto_diag => 1, > sep_char => '|', > allow_whitespace => 1, > } > ); > my $file = $ARGV[0] or die "Need to get CSV file on the command line\n"; > my @result = (); > open( my $data, '<:encoding(utf8)', $file ) > or die "Could not open '$file' $!\n"; > > while ( my $fields = $csv->getline($data) ) { > push @result, ( join( ';', @{$fields}[ 1, 3 .. 5, 2 ] ) . ';' ); > } > if ( not $csv->eof ) { > $csv->error_diag(); > } > close $data; > print join( "\n", @result ); > > sub prepare_encoding_console { > if ( is_interactive() ) { > binmode STDIN, ':encoding(console_in)'; > binmode STDOUT, ':encoding(console_out)'; > binmode STDERR, ':encoding(console_out)'; > } > Encode::Locale::decode_argv(); > return 1; > } > > https://github.com/mishin/presentation/blob/master/gen_csv.pl > > исходный файл > https://github.com/mishin/presentation/blob/master/test.txt > запускать так > > perl gen_csv.pl test.txt > 12345678901234567890;ФАМИЛИЯ;ИМЯ;ОТЧЕСТВО;760.00; > 12345678901234567890;ФАМИЛИЯ1;ИМЯ1;ОТЧЕСТВО;760.00; > > 05.04.2015, 23:40, "Кузьменко Константин" <[email protected]>: >> Вот так "/\s*\|\s*/" удаляются пробелы и "\n" и тд и тп но мне же надо >> оставить "\n" в конце строки >> Подходит это: >> $_ =~ s/\h+//g; >> $_ =~ s/\|/;/g; >> Вопрос как удалить столбци >> >> -- >> Специалист IT, GNU, FLOSS, Open Source >> Моб: +7 (951) 131 33 90 >> С уважением, >> Кузьменко Константин Викторович >> >> 05.04.2015, 23:24, "Ilya Chesnokov" <[email protected]>: >>> 5 апреля 2015 г., 23:14 пользователь Кузьменко Константин >>> <[email protected]> написал: >>>> Это файл TXT >>>> 123 | 12345678901234567890 | 760.00 |ФАМИЛИЯ |ИМЯ >>>> |ОТЧЕСТВО |123456|222|888|9|RU|00007| >>>> На Выходе должен получиться CSV >>>> 12345678901234567890;ФАМИЛИЯ;ИМЯ;ОТЧЕСТВО;760.00; >>> Это вообще проще без регулярок делать. А банальным split-ом (с >>> минимальной регуляркой вида /\s*|\s*/) и join-ом (ну или при помощи >>> модуля Text::CSV). >>>> -- >>>> Специалист IT, GNU, FLOSS, Open Source >>>> Моб: +7 (951) 131 33 90 >>>> С уважением, >>>> Кузьменко Константин Викторович >>>> >>>> 05.04.2015, 18:16, "Иван Миронов" <[email protected]>: >>>>> Константин, Добрый день! >>>>> >>>>> Попробуйте уменьшить жадность квантификаторов добавив после знаков >>>>> звездочки вопросительный знак. >>>>> >>>>> s/^(.*?;).*?;.*?;.*?;.*?;.*?;(.*?;.*?;.*?;.*?;.*?;.*?;)$//g; >>>>> >>>>> Если не получится, я думаю было бы здорово если бы вы приложили пример >>>>> исходных данных для этого регулярного выражения. >>>>> >>>>> воскресенье, 5 апреля 2015 г. пользователь Алексей Мышкин написал: >>>>>> Есть подозрение что жадный квантификатор берёт всё что может, и >>>>>> строке за скобками уже ничего не остаётся. >>>>>> >>>>>> 5 апреля 2015 г., 15:42 пользователь Кузьменко Константин >>>>>> <[email protected]> написал: >>>>>>> Добрый день Moscow.pm >>>>>>> Не могу понять регулярки перл! >>>>>>> >>>>>>> #!/usr/bin/perl >>>>>>> >>>>>>> use strict; >>>>>>> use warnings; >>>>>>> use utf8; >>>>>>> use open qw/ :encoding(utf8) :std /; >>>>>>> #use open qw/ :encoding(cp1251) :std /; >>>>>>> >>>>>>> my @onfil = @ARGV; >>>>>>> open(INFIL, "<:encoding(cp866)", $onfil[0]) >>>>>>> or die "NO STANDART $!"; >>>>>>> >>>>>>> while (<INFIL>) { >>>>>>> $_ =~ s/\h+//g; >>>>>>> $_ =~ s/\|/;/g; >>>>>>> $_ =~ s///g; >>>>>>> $_ =~ s/^(.*;).*;.*;.*;.*;.*;(.*;.*;.*;.*;.*;.*;)$//g; # Не >>>>>>> удаляется в скобках >>>>>>> print; >>>>>>> } >>>>>>> >>>>>>> close INFIL; >>>>>>> >>>>>>> __END__ >>>>>>> >>>>>>> Может что нибудь посоветуете >>>>>>> зы: Z yjdbxjr d Зукл >>>>>>> -- >>>>>>> Специалист IT, GNU, FLOSS, Open Source >>>>>>> Моб: +7 (951) 131 33 90 >>>>>>> С уважением, >>>>>>> Кузьменко Константин Викторович >>>>>>> >>>>>>> -- >>>>>>> Moscow.pm mailing list >>>>>>> [email protected] | http://moscow.pm.org >>>>>> -- >>>>>> С уважением, >>>>>> Мышкин Алексей. >>>>> -- >>>>> С уважением, Миронов Иван! >>>>> тел.: +7 (926) 206-90-39 >>>>> >>>>> , >>>>> >>>>> -- >>>>> Moscow.pm mailing list >>>>> [email protected] | http://moscow.pm.org >>>> -- >>>> Moscow.pm mailing list >>>> [email protected] | http://moscow.pm.org >>> -- >>> Best regards, >>> Ilya Chesnokov >>> -- >>> Moscow.pm mailing list >>> [email protected] | http://moscow.pm.org >> -- >> Moscow.pm mailing list >> [email protected] | http://moscow.pm.org > > -- > С уважением > Николай Мишин > > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org -- Moscow.pm mailing list [email protected] | http://moscow.pm.org
