電子書籍の厳選無料作品が豊富!

あるディレクトリにtest1.txtとtest2.txtというカンマ区切り(拡張子はcsvではないですけど)があったとして、それらのファイルを1行ずつ読み込み、それを追加書き出しで1つのファイルに収めていこうとしています。

そこで以下のようなコードを書いてみたのですが、どうやらtest1.txtしか読み込んで書き出せていないようなのです。その原因が分からずに困っています。

$dir = 'C:/Perl/workdir';# 対象ディレクトリ名

open MYHANDLE, ">>out.txt";# 追加書き出しモードでファイルハンドルをオープン

opendir DH, $dir or die "$dir:$!";# ディレクトリを開く

while ($file = readdir DH) {# ディレクトリにあるファイル名を取得し、$fileに格納
next if $file =~ /^\.{1,2}$/;# '.'や'..'も取れるので、スキップする
open MYFILE, "$file";# 取得したファイルを開く
while (<MYFILE>) {
chomp;
@dat = split /,/;# 読み込むファイルは「カンマ区切り」としてレコードを読み込む。
$n = @dat;
for($i=0; $i<$n; $i++){
print MYHANDLE $dat[$i];# ファイルに追加書き出し(ファイルがなければ新規作成される)
print MYHANDLE ",";# カンマ区切りで書き出していく
}
print MYHANDLE "\n";# 1行読み終えるごとに改行
}
close MYFILE;# i番目のファイルを読み終えたら閉じる
print $file, "\n";# 読み込み・書き出しをしたファイル名を表示する
}

closedir DH;

close MYHANDLE;

A 回答 (2件)

(MS-DOS 風に書くと) c:\Perl\workdir にあるファイル名を使ってカレントディレクトリのファイルをオープンしようとしてるんだから, ディレクトリ c:\Perl\workdir が (このスクリプトを実行している) カレントディレクトリでなければ正しい動作をしないと判断できる. たとえば


・c:\Perl\workdir には test1.txt, test2.txt がある
・カレントディレクトリには test1.txt はあるが test2.txt はない
というような状況であれば
「(カレントディレクトリにある) test1.txt は読み込めるが test2.txt は (カレントディレクトリにはないので) 読み込まない」
ということになる.
    • good
    • 0
この回答へのお礼

回答ありがとうございす。

理解できました(^_^;)

おっしゃるとおり、カレントディレクトリにtest1.txtだけが置いてありました。私はworkdirにあるtest1.txtが読み込まれたのだと思い込んでしまっていました。workdirにあるファイルを読み込みたければ、カレントディレクトリを先に変更しておかないといけなかったのですね。

お礼日時:2011/02/02 20:59

「対象となるディレクトリ」と「カレントディレクトリ」との関係は?


「ファイル名がきちんと取れていること」は確認できてますか? そして, 「必要なファイル」がオープンできていることも確かめていますか?

そもそも何でこんなことを Perl でしている? それなりなコマンドたたくだけではダメなの?

動作には関係ないけど, なんで split してるんだろう. やってることって, 「行末にカンマを追加する」だけだよねぇ....
    • good
    • 0
この回答へのお礼

すいません、聞かれていることに対してきちんと返答できているか分からないのですが。。。

> 「対象となるディレクトリ」と「カレントディレクトリ」との関係は?

コメントに対象となるディレクトリと書いているのは、テキストファイルが保存されているディレクトリのことで、スクリプトを実行するたびに特定のディレクトリ(フォルダ)を指定したいためです。

> 「ファイル名がきちんと取れていること」は確認できてますか?

ファイルに書き出しではなく、コンソール画面(コマンドプロンプト)に$fileに入れられた各ファイル名を評させると、きちんと表示されるのでファイル名を取得できていることは間違いなさそうです。

> 「必要なファイル」がオープンできていることも確かめていますか?

少なくともC:/Perl/workdirに保存されている2つのファイルのうち1つはきちんと読み込んで、ファイルへ書き出しもできています。

> そもそも何でこんなことを Perl でしている?

これはスクリプトの一部なので、実際にはカンマ区切りのデータを読み込んで、途中で色々とやることがあるからです。

お礼日時:2011/02/02 14:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!