Разделить файл на несколько небольших файлов

У меня есть код, который позволяет мне обрабатывать файл, в котором он ищет все строки, начинающиеся с «false», и возвращает их мне.
Я хотел бы, чтобы каждая строка с «false» сохранялась в файле, а именно.

#!/usr/bin/perl

use warnings;
use strict;
open(DATA, '<', 'DATA.csv');
my @a = <DATA>;
my @b = grep(/false/, @a);
chomp(@b);
for (my $i=0; $i <= $#b; $i++) {
    print $i + 1;
    print ". ";
    print split('false',"$b[$i]\n");
}

__________________ДАННЫЕ____________________________________

    2015.07.23  16:47:23
                  false,    false,       true,      false,    true,    false,
          defau,  ame_a,    ame_m,       ame_uc,     ame_f,    ams_l,  en_affi,
    true  DPA01,  fault,    fault,       fault,      fault,    fault,      1,
    false DPA02,  dfgeh,         ,            ,           ,    fault,      1,
    true  DPA03,  fault,    fault,         olt,      fault,    fault,      1,
    false DPA01,  fault,       at,       fault,          2,    fault,      1,
    false DPA02,  dfgeh,         ,            ,           ,    fault,      1,
    true  DPA03,  fault,    fault,         olt,      fault,    fault,      1,

___DPA02___________________

dfgeh



fault
1

___DPA01________________

fault
at
fault
2
fault
1

___DPA02_____________

dfgeh



fault
1

person Paul    schedule 12.08.2015    source источник
comment
То, что делает ваш код, совсем не то, что вы описываете. Непонятно, что должен означать вывод, который вы показываете (скорее, несколько выводов). Пожалуйста, отредактируйте свой вопрос и попытайтесь описать проблему, с которой вы столкнулись. Кроме того, вы не ищете строки, начинающиеся с false. Вы получаете строки, которые содержат false в любом месте строки. Есть разница.   -  person simbabque    schedule 12.08.2015
comment
@Paul: Как вы создаете два файла с одинаковыми именами? Вы творите на другом пути?   -  person serenesat    schedule 12.08.2015
comment
Вам нужно почистить язык в своих вопросах. Вы также должны обратиться к своим предыдущим вопросам: 1, 2.. Каждый раз, когда вы используете другое имя пользователя... это нехорошо style.. Вы также разместили очень похожий вопрос с именем пользователя Serge, но, возможно, вы удалили его? Основная проблема с вашими вопросами - английский язык. Очень сложно понять, что вы ищете.   -  person Håkon Hægland    schedule 12.08.2015


Ответы (1)


Я думаю, что вы пытаетесь сделать следующее:

  1. Прочитайте строку из CSV-файла.
  2. If it starts with 'false':
    1. Extract all the columns.
    2. Откройте файл, используя содержимое столбца 2 в качестве имени.
    3. Запишите остальные элементы в строке в этот файл, по одному элементу в строке.

Программа, которая у вас есть, не будет этого делать вообще.

Сначала я предлагаю использовать модуль Text::CSV из CPAN, если вы хотите безопасно обрабатывать файлы CSV. Если вы это сделаете, процесс станет намного проще:

use strict;
use warnings;

use Text::CSV;

my $csv = Text::CSV->new;
open my $csv_file, "<", "DATA.csv" or die "Can't open CSV file: $!\n";
while (my $row = $csv->getline($csv_file)) {
    # First item is significator plus filename.
    my($significator_and_file) = clean($row->[0]);
    my ($significator, $file) = split /\s+/, $significator_and_file;
    next unless $significator and $significator eq 'false';

    open my $per_line_fh, ">>", $file or die "Can't open per-line file $file: $!\n";

    # One item per line, plus final newline.
    shift @$row;
    print $per_line_fh join "\n", map { clean($_) } @$row;
    print $per_line_fh "\n";
    close $per_line_fh;
}

sub clean {
    my $string = shift;
    $string =~ s/^\s+//;
    $string =~ s/\s+$//;
    return $string;
}
person Joe McMahon    schedule 12.08.2015
comment
Привет, Джо МакМахон, это звучит как глупый вопрос, я попробовал ваш код и искал то, что вы, возможно, забыли, к сожалению, у меня нет файлов. - person Paul; 12.08.2015
comment
Отредактировано, чтобы очистить довольно беспорядочный формат данных. Дополнительные пробелы в данных, как в вашем примере, должны быть удалены, чтобы данные можно было сравнивать и использовать должным образом. Сочетание true/false и имени файла особенно неприятно. - person Joe McMahon; 12.08.2015
comment
отлично, МакМахон Спасибо - person Paul; 12.08.2015