Дублирование строк в файле с помощью Perl - PullRequest
1 голос
/ 02 мая 2011

Я думал, что это будет безумно легко, но я в тупике.Я хочу взять каждую строку в файле и дублировать ее восемь раз.Вот код, который я использую:

#!/usr/bin/perl
use warnings;
use strict;
use diagnostics;


my $inputFile = "Providers list.csv";
my $outputFile = "Providers list2.csv";
open my $FHI, '<', $inputFile || die "cannot open input file";
open my $FHO, '>', $outputFile || die "cannot open output file";

while (<$FHI>) {
    for ( my $i = 0; $i < 8; $i++) {
    print $FHO "$_\r";
}
}

close $inputFile;
close $outputFile;

Вместо того, чтобы дублировать каждую строку восемь раз, она повторяет все содержимое файла восемь раз.Другими словами, вместо этого:

Line1
Line1
Line1
Line1
Line1
Line1
Line1
Line1

Я получаю это:

Line1
Line2
Line3
Line1
Line2
Line3

И т.д., восемь раз.Я не понимаю, почему он не обрабатывает каждую строку в отдельности.

TIA!

Ответы [ 3 ]

6 голосов
/ 02 мая 2011

Если исходный файл также имеет окончания строк в Mac, попробуйте установить разделитель входной записи с помощью $/ = "\r" в начале сценария. Если это проблема, то вам также не нужно печатать \r с выводом, если вы не chomp редактировали данные.

3 голосов
/ 02 мая 2011

Возможно, вы читаете файл Mac на платформе, отличной от Mac.

В этом случае другой вариант - преобразовать окончания строк за пределами вашего сценария: он имеет преимущество в том, что сам сценарий может выполняться без изменений на любой комбинации файлов платформы / исходного кода, но, конечно, он медленнее (по сравнению с предложением Энди). ).

Он состоит из трех шагов: сначала преобразование новой строки (если вы используете * nix):

perl -pe 's/\r/\n/g' macfile.csv > unixfile.csv

затем ваш скрипт (без добавления \r при печати, как уже сказал Энди) или просто из командной строки:

perl -l0ne 'print "$_\n" x 8' unixfile.csv > unixfile8.csv

, который, если вы уверены, что ваш исходный файл заканчивается новой строкой, может быть дополнительно уменьшен до:

perl -ne 'print $_ x 8' unixfile.csv > unixfile8.csv

и наконец:

perl -pe 's/\n/\r/g' unixfile8.csv > macfile8.csv

О вашем скрипте: просто помните, что use diagnostics также автоматически активирует warnings, и что предпочтительный стиль для имен переменных Perl - $all_lowercase_with_underscore.

Также взгляните на Новые строки Perl на разных платформах

1 голос
/ 02 мая 2011

Оператор x может использоваться для печати чего-либо несколько раз, поэтому

print $_ x 8;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...