2015-08-12 20 views
0

У меня есть код, который позволяет обрабатывать файл, в котором он ищет всю строку, начинающуюся с «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"); 
} 

__________________DATA____________________________________

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 
+1

Что делает ваш код вовсе не то, что вы описываете. Неясно, что должен означать вывод, который вы показываете (а не несколько выходов). Пожалуйста, отредактируйте свой вопрос и попытайтесь описать проблему, с которой вы сталкиваетесь. Кроме того, вы не ищете строки, начинающиеся с 'false'. Вы получаете строки, которые _contain_ 'false 'находятся в любом месте строки. Есть разница. – simbabque

+0

@Paul: Как вы создаете два файла с одинаковым именем? Вы создаете на другом пути? – serenesat

+0

Вам нужно очистить язык в своих вопросах. Вы также должны обратиться к своим предыдущим вопросам: [1] (http://stackoverflow.com/questions/31725457/how-to-build-a-file-splitter-in-perl), [2] (http: // stackoverflow.com/questions/31688466/compare-2-file-line-and-column) .. Каждый раз, когда вы используете другое имя пользователя .. это не хороший стиль. Вы также опубликовали очень похожий вопрос с именем пользователя ' Серж, но, может быть, вы его удалили? Главная проблема с вашими вопросами - английский язык. Очень сложно понять, что вы ищете. –

ответ

0

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

  1. Читать строку из файла CSV.
  2. Если оно начинается с «false»:
    1. Извлечь все столбцы.
    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; 
} 
+0

Привет, Джо МакМэхон, это звучит как глупый вопрос, я пробовал свой код и искал то, что вы, возможно, забыли, к сожалению, я не получаю никаких файлов. – Paul

+0

Отредактировано для очистки довольно грязного формата данных. Дополнительные пробелы в данных, которые есть в вашем примере, должны быть очищены, чтобы можно было сравнивать и использовать данные. Сочетание true/false и имени файла является особенно болью. –

+0

отлично, МакМахон Спасибо – Paul

Смежные вопросы