2013-07-16 3 views
0

Я использую ниже решение из более раннего решения от Alan, которое работает для объединения текстовых файлов с символом Pipe. Благодаря !Perl: слияние нескольких текстовых файлов и разделенных файлов

Merge multiple text files and append current file name at the end of each line

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

use Text::CSV; 

my $csv = Text::CSV->new({ 'sep_char' => '|' }); 

open my $fho, '>', 'combined.csv' or die "Error opening file: $!"; 

while (my $file = <*.txt>) { 
    open my $fhi, '<', $file or die "Error opening file: $!"; 
    (my $last_field = $file) =~ s/\.[^\.]+$//; # Strip the file extension off 
while (my $row = $csv->getline($fhi)) { 
    $csv->combine(@$row, $last_field); # Construct new row by appending the file   name without the extension 
    print $fho $csv->string, "\n";  # Write the combined string to combined.csv 
    } 
} 

Если кто-то может помочь улучшить решение со следующими более 3 требования, было бы полезно.

1) В моих текстовых данных некоторые данные находятся в кавычках в форматированном формате; |"XYZ NR 456"|

Выше решение помещает эти данные в разные столбцы, когда я открываю конечный файл comb.csv. Есть ли способ обеспечить, чтобы все данные были объединены в символ канала при объединении.

2) Удалить всю строку, где она находит слово Place_of_Destination

3) Текущее решение добавляет имя файла в конце каждой строки. Я также хочу разделить имя файла с символами трубопровода

Структура моего имени файла X_INRUS6_08072013.txt, решение добавляет символ и имя файла X_INRUS6_08072013 в конце каждой строки. То, что я также хочу сделать, это разделить это имя файла дальше в следующем; X | INRUS6 | 08072013

Возможно ли это, заблаговременно за помощь.

ответ

0

Что касается вашей точки 2, для того, чтобы пропустить строки, вы можете использовать «следующий, если», с эффектом пропуска линии заинтересованных:

next if ($line =~ /Place_of_Destination/) 

или «если», по вашему желанию :

unless ($line =~ /Place_of_Destination/) { 
    # do something 
} 

Если я правильно понял, что вы пытаетесь сделать, это испытание должно использоваться во втором цикле «while».

+0

После того, как файл был сложен перед печатью, мне нравится удалять целую строку, где она содержит Place_of_Destination. Я не perl/code savvy, просто пытаюсь использовать старое решение для моей потребности. Я попытался использовать ваш вход, но он не сработал. – Niriv

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