2013-07-16 2 views
0

텍스트 파일을 파이프 문자와 결합하는 Alan의 이전 솔루션에서 아래의 솔루션을 사용하고 있습니다. 감사 ! 사람이 3 개 요구 사항을 다음과 솔루션을 강화하는 데 도움 수 있다면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 
    } 
} 

, 도움이 될 것입니다.

1) 내 텍스트 데이터 내에서 일부 데이터는 forllowing 형식의 따옴표 안에 있습니다. |"XYZ NR 456"|

위의 솔루션은 최종 combine.csv 파일을 열 때이 데이터를 다른 열에 배치하는 것입니다. 병합 할 때 파이프 문자 내에 모든 데이터가 결합 된 상태로 유지되는 방법이 있습니까? 이

3 워드 Place_of_Destination 발견 여기서

2) 현재 솔루션은 각 라인의 마지막에 파일명을 추가한다)의 전체 행을 삭제한다. 또한 파이프 문자로 파일 이름을 분할 할

내 이름 구조는 솔루션은 더이 파일 이름을 분할하고 각 줄의 끝에서 파이프 문자와 파일 이름 X_INRUS6_08072013을, 내가 또한하고 싶은 것은 추가 X_INRUS6_08072013.txt입니다 다음; X | INRUS6 | 08072013

모든 도움을 위해 미리 감사드립니다. 당신의 소원으로, '않는'

next if ($line =~ /Place_of_Destination/) 

나 :

답변

0

는 점 2에 관해서는, 라인을 생략하기 위해, 당신은 관련 라인을 건너 뛰는의 효과하는 '경우 다음'을 사용할 수 있습니다 :

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

이 테스트를 수행하려고하는 것이 무엇인지 제대로 이해했다면 두 번째 'while'루프에서 사용해야합니다.

+0

파일이 인쇄 전에 병합되면 Place_of_Destination이 포함 된 전체 행을 제거하는 것이 좋습니다. 나는 Perl/코드에 능숙하지 않으며, 단지 나의 필요를 위해 오래된 솔루션을 사용하려한다. 나는 당신의 입력을 사용하려했지만 작동하지 않았다. – Niriv