都道府県穴埋めゲーム

同フォルダ内にAフォルダにaa,bb,ccというテキストファイルがあります。これをex.txtファイルにaa,bb,ccファイルの内容をコピーしたいのですが、うまくいきません。

最初はuse File::Copyでやろうとしましたが、これはディレクトリの中のファイルの指定がわからず、断念。
次にwhile文でやってみましたが、これも引数の指定がわからない状態です。

もしよければお知恵を貸してください。

A 回答 (6件)

#3です。



試していなかったので、ちょっと確認してみました。

ファイルを開くところでディレクトリを指定していなかったのでファイルが開けずに書き込まれない状態になっていたようです。
ですので、ディレクトリの指定を追加してください。

$dir = "A";
open(OUT , "> ex.txt");
opendir(DIR , $dir);
while ($file = readdir(DIR))
{
open(IN , "$dir/$file");
print OUT while (<IN>);
close(IN);
}
closedir(DIR);
close(OUT);
    • good
    • 0
この回答へのお礼

ありがとうございました。これだけ短くてわかり易いコードは
理想的でしかもやりたいことが完全にできました。

ここから更に機能を増やしていきたいと考えています。
またもし質問することがあれば宜しくお願いします。

お礼日時:2008/03/15 01:30

ANo.4 の補足部分から引用


> 今後のためにも過程を大事にしたいので・・
> 質問の意味もわかりにくかったと思うのでもう一度整理して書きます。

なんとなくはわかるんですが、確認させてください。

以降の引用は QNo.3855079 からの引用
> Aフォルダにaa,bb,ccというテキストファイル

要するにディレクトリ構成はこうなっているのでしょうか?
# ディレクトリ B は余計かもしれないですけど。

./
|--A/
| |-- aa
| |-- bb
| |-- cc
|
|--B/
| |--dd
(以下略)

と、なっているものを A/aa ... B/dd... と全て見つけたいのですか?
これを「工程 1」として

列挙したファイル(aa 、bb 、cc や B/dd)を読み込んで、カレントディレクトリの
ex.txt に列挙したファイルの中身を追記して保存したいということでしょうか?
これを「工程 2」として

「工程 1」を実現する場合は File::Find というものがあります。
使う方法は下記の URL をご覧になってください。
http://katsubemakito.net/cgiperl/2006/10/perl2.h …

# ただし各引数の意味がわかるまでは使わないほうがよろしいと思います。

カレントディレクトリまたは、任意のディレクトリの下層を含めて繰り返して
ファイルの列挙するようなことを「"再帰的"な検索」と言います。

# 余計なことで申し訳ないですが、気になったことを記述させて頂きます。
# 細かいことはスルーすべきなのでしょうけど。

> File::Copy

と、モジュールを使おうとなさっておられたのに……

> while文でやってみましたが、これも引数の指定がわからない状態

これは while 文のひき数がわからないということだったのでしょうか?
ひき数についての調査はご自分でどこまでなされたのでしょうか?

勉強したいという意志をお持ちなら、焦らずにひとつひとつの持つ意味を
理解してプログラミングをされるほうがよろしいのではないでしょうか?
ただコードを貼るのではなくに、ご自身が意図する動作をコメントとして
書いて頂けるとわかりやすくなります。

# 回答者の方々とのやりとりを拝見していると、努力されているのは
# わかりますけど。

また、ご質問のスレッドごとにお使いの環境などを書いていただけると
助かります。
OS や Perl のバージョンによっては使えないモジュールがあるからです。

たとえば、こんな感じで
<Perl>
perl 5.8.8 等
<OS>
linux(Fedora8) や WindowsXP 等

このような情報は、質問する方と回答する方の双方にメリットがあること
だと思いますので、そうなさったらいかがでしょうか?

# くどいことを申し上げたので、どうお感じになられるかは判りませんが、
# 別に意地悪で言っているのではないのです。がんばってください。

この回答への補足

丁寧にありがとうございます。確認事項についてはその通りです。

工程1に関しては、何とかできました。問題は工程2です。
今日も一日かけましたが、できず・・

パールのバージョンはtelnetを使えないので見れませんでした。

Aフォルダを開く 
Aフォルダ内のファイルの一覧を取得する
Aフォルダ内のファイルの内容を表示
書き込み用exファイルを開く KS
ファイルの内容が蓄積された配列をexファイルにプリントする
print KS @line;

わかりにくいかもしれません。。 自分でも思いますがこういった手順を本などを見ながら今も模索中です。
再帰的な検索がこうも難しいとは…

  

補足日時:2008/03/14 02:31
    • good
    • 0

これ, 悩むくらいなら system 使った方がはやいんじゃない?

この回答への補足

今後のためにも過程を大事にしたいので・・
質問の意味もわかりにくかったと思うのでもう一度整理して書きます。

◎条件
試作フォルダ内にsisaku.bat sisaku.pl ex.txt Aフォルダがあって Aフォルダ内に aa.txt,bb.txt,cc.txt というテキストファイルが3つあります。 テキストファイルの内容は何でもいいのですが、例えばaa.txt には aaaaaa bb.txt には bbbbbbb
tttttt ggggggg
などと書き込まれている。

★やりたいこと
ex.txt ファイルに Aフォルダ内にある3つのファイル全ての内容を書き込みたい。    
ex.txt aaaaaa
tttttt
bbbbbb
gggggg ← のように
今のところ、ファイルを1個ずつ指定すれば書き込めるが、フォルダ内のファイルが例えば1000個に増えたとき、いちいち指定するのは
実用性がないので、何か方法がないかと考えて相談させてもらった次第です。 この説明で伝わったでしょうか?。。

補足日時:2008/03/13 00:35
    • good
    • 0

opendir()、readdir() でディレクトリの内容を取得して、ファイルの内容を読み出して書き込んでいくというのでは駄目でしょうか?



open(OUT , "> ex.txt");
opendir(DIR , "A");
while ($file = readdir(DIR))
{
open(IN , $file);
print OUT while (<IN>);
close(IN);
}
closedir(DIR);
close(OUT);

実行していませんがこれで上手くいくでしょうか?インデントは調整してください。

この回答への補足

ソースコードありがとうございます。
実行してみましたが、うまくいきませんでした。

my $dirname = '.';
opendir(DIR, $dirname) or die "$dirname: $!";
while ( my $dir = readdir(DIR)) {
next unless (-f $dir);
next unless ($dir =~ /.\txt$/);
print $dir, "\n";

open(FILE, $dir) or die "$dir: $!";
while (my @line = <FILE>) {
print @line;

}
close(FILE);
}
closedir(DIR);

↑こういうのも試しましたが、最後のファイルの内容しか書き込めません。フォルダ内のファイルの内容を表示させることは何とかできても、
表示した内容を全部書き込めないのが現状です。

補足日時:2008/03/13 00:25
    • good
    • 0

 いっぺんにやらず一つずつコピペしていくとかじゃだめかな

この回答への補足

ファイルが100入っててもいいようにしたいので・・

補足日時:2008/03/13 00:16
    • good
    • 0

質問が意味不明です。

この回答への補足

同フォルダ内のAフォルダに

ここですね。間違えました。

補足日時:2008/03/13 00:14
    • good
    • 0

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