2012-05-28 3 views
-2

File1.csv, File2.csv, ..., File1000.csv라는 이름의 천 개의 파일이있는 폴더가 있고 각 줄마다 몇 줄이 있다고 가정 해 봅시다. 세미콜론으로 구분 된 (;) 데이터 값.여러 줄의 텍스트 파일을 병합하고 각 줄 끝에 현재 파일 이름을 추가하십시오.

각 파일을 하나씩 추가하고 각 행 끝에 현재 처리중인 파일의 이름을 추가하여 해당 폴더에있는 모든 CSV 파일을 하나씩 "병합"하는 Perl 스크립트가 필요합니다 (예 : "; File2").

스티브

+2

매우 직설적입니다. 너 뭐 해봤 니? – delicateLatticeworkFever

+0

명백하게 묻는 것에 대해 유감스럽게 생각합니다. 그러나 PERL 프로그래밍에 익숙하지 않고 그의 대답에 대해 Alan에게 감사드립니다. – Steve06

답변

1

Text::CSV는 CSV를 구문 분석하는 데 사용할 수 있습니다. 다음 스크립트는 CSV 파일이 들어있는 디렉토리에서 실행됩니다. 재귀 적 (glob 사용)입니다. 파일을 재귀 적으로 찾길 원하는 경우 File::Find Perl 모듈을 사용할 수 있습니다.

#!/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 = <*.csv>) { 
    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

그것은 멋지다, 그것은 매력처럼 일했다! 고맙습니다, 앨런. PERL에 익숙하지 않아서, 혼자서 알아 내지 못하면서 두 시간의 시간을 절약 할 수있었습니다. 단지 기록을 위해 명령 프롬프트에 "ppm install Text-CSV"를 입력하여 ActivePerl 설치용 CSV 파일을 수동으로 설치해야했습니다. – Steve06

+0

왜 CSV 파일인지 중요하지 않습니다. 일반 텍스트 파일로 읽고 각 행의 끝에 "; $ last_field"를 추가하십시오. 'while ($ line = <$fhi>) {chomp $ line; $ line. = "; $ last_field"; print $ line, "\ n";}' – Barmar

관련 문제