2016-10-12 6 views
1

私は別々のCSVファイルに分割したいいくつかの列と行(それぞれ6000個の奇数行と+60個の列)各ファイルは、最初の列の最初の行に表示される文字列と命名されるべきである与えられた文字列(文字列の間の線の数が異なる)で...例えば:Perl:指定された文字列でCSVを分割し、特定の文字列をファイル名として使用

Peter B1 C1 D1 
A2  B2 C2 D2 
A3  B3 C3 D3 
END B4 C4 D4 
Jack B5 C5 D5 
A6  B6 C6 D6 
A7  B7 C7 D7 
END B8 C8 D8 
Billy B9 C9 D9 
A10 B10 C10 D10 
A11 B11 C11 D11 
END B12 C12 D12 

SO 3が存在すべきですピーター、ジャック、ビリーという名前のファイルに、このファイルに書き込まれる最後の行であることを示すENDという単語が付いています。ピーターは範囲A1(ピーターという言葉を含む)をD4に含む。ジャックA5からD8、ビリーA9からD12。

use strict; 
use warnings; 

### INPUT 
my $split_woord = 'END';  #word that signals file to be split 
print "Input file: "; 
my $file_name = <STDIN>; 

my $input_file = "file locataion/$file_name.csv"; 

### OPEN 
open (INPUT, ">", "$input_file") or die "Can't open $file_name: $!\n"; 

my $name= undef; 

while (<INPUT>){ 

    my $line = $_; 

    my ($a,$b,$c,$d)=split('\,', $line); 

    until ($a eq $split_word){  #loop until column 1 reads 'END', then restart 
    $name eq $a;     #want to indictae first line 

    my $output_file = "file_location/$name.csv"; 
    open (OUTPUT, ">>", "$output_file") or die "Can't create $output_file: $!\n"; 

    print OUTPUT "$a,$b,$c,$d\n"; 
    next; 

    } 

} 

exit; 

私が正しくループにそれを得ることができないよう、また、ファイルの名前として機能するように、最初の列/行を使用するために苦労しています:

私はこれまでのところ、これを持っています。どんな助けも大いに評価されるでしょう!すべてのTIA

+0

'csplit'はシェルコマンドです。それを試してみましたか? – Ashish

+0

また、他の質問もチェックしてください。http://stackoverflow.com/questions/8272017/split-files-based-on-file-content-and-pattern-matching – Ashish

+1

ここで課題を行うことを意味していますか? $ name eq $ a; #最初の行を示すことを望みます$ name = $ a; – jmcneirney

答えて

2

まず、あなたの行:それはWRITINGのためのファイルを開くているよう

open (INPUT, ">", "$input_file") 

が見える - あなたが正しい、それを読むしたいですか?

本当にCSVファイルを扱っている場合は、カンマで区切る代わりにText::CSVを調べるとよいでしょう。これは、すべての最近のバージョンを標準装備し、それは避けられないハンドル:

言っ
ID  Quote    Date 
1   No, I'm fine   1/1/2016 
2   Roger Winco   5/1/2016 

、手元にある本当の問題...繰り返さない名前を想定し

、あなたが開くことができるはずですファイルハンドルを出力し、終了する単語にヒットするまで続けてください:

+0

"これはすべての最新バージョンに標準で付属しています"残念ながら、これは当てはまりません。おそらくText :: BalancedやText :: ParseWordsについて考えているのでしょうか? – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot - 私はそれがだと思ったが、私は間違っていなければならない。訂正ありがとう – Hambone

関連する問題