あるディレクトリに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;
No.2ベストアンサー
- 回答日時:
(MS-DOS 風に書くと) c:\Perl\workdir にあるファイル名を使ってカレントディレクトリのファイルをオープンしようとしてるんだから, ディレクトリ c:\Perl\workdir が (このスクリプトを実行している) カレントディレクトリでなければ正しい動作をしないと判断できる. たとえば
・c:\Perl\workdir には test1.txt, test2.txt がある
・カレントディレクトリには test1.txt はあるが test2.txt はない
というような状況であれば
「(カレントディレクトリにある) test1.txt は読み込めるが test2.txt は (カレントディレクトリにはないので) 読み込まない」
ということになる.
回答ありがとうございす。
理解できました(^_^;)
おっしゃるとおり、カレントディレクトリにtest1.txtだけが置いてありました。私はworkdirにあるtest1.txtが読み込まれたのだと思い込んでしまっていました。workdirにあるファイルを読み込みたければ、カレントディレクトリを先に変更しておかないといけなかったのですね。
No.1
- 回答日時:
「対象となるディレクトリ」と「カレントディレクトリ」との関係は?
「ファイル名がきちんと取れていること」は確認できてますか? そして, 「必要なファイル」がオープンできていることも確かめていますか?
そもそも何でこんなことを Perl でしている? それなりなコマンドたたくだけではダメなの?
動作には関係ないけど, なんで split してるんだろう. やってることって, 「行末にカンマを追加する」だけだよねぇ....
すいません、聞かれていることに対してきちんと返答できているか分からないのですが。。。
> 「対象となるディレクトリ」と「カレントディレクトリ」との関係は?
コメントに対象となるディレクトリと書いているのは、テキストファイルが保存されているディレクトリのことで、スクリプトを実行するたびに特定のディレクトリ(フォルダ)を指定したいためです。
> 「ファイル名がきちんと取れていること」は確認できてますか?
ファイルに書き出しではなく、コンソール画面(コマンドプロンプト)に$fileに入れられた各ファイル名を評させると、きちんと表示されるのでファイル名を取得できていることは間違いなさそうです。
> 「必要なファイル」がオープンできていることも確かめていますか?
少なくともC:/Perl/workdirに保存されている2つのファイルのうち1つはきちんと読み込んで、ファイルへ書き出しもできています。
> そもそも何でこんなことを Perl でしている?
これはスクリプトの一部なので、実際にはカンマ区切りのデータを読み込んで、途中で色々とやることがあるからです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- その他(プログラミング・Web制作) Pythonを勉強しています。 5 2023/08/25 09:51
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
readdir()で得られるファイル・...
-
find関数が1階層(カレントディ...
-
FindFirstFileとFindNextFileで...
-
複数ファイルの読み込みについて
-
Windowsで複数のファイルを同じ...
-
指定したフォルダにアップロード
-
vba dir の相対パス
-
パスから最後のディレクトリだ...
-
batファイルでrenameができませ...
-
window.open でのファイル指定方法
-
VBAでCSVファイルの特定行を書...
-
ReadLineでの読み出し行を指定する
-
awkスクリプトでダブルクォーテ...
-
VBAで巨大なファイルの途中から...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルを途中行まで...
-
htaccessで特定のディレクトリ...
-
fopenでディレクトリ内の全ファ...
-
ファイル出力の改行コードをLFに
-
エクセルVBAで素数だけを出力す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
batファイルでrenameができませ...
-
C言語でファイル名を取得
-
FindFirstFileとFindNextFileで...
-
パスから最後のディレクトリだ...
-
vba dir の相対パス
-
readdir()で得られるファイル・...
-
Windowsで複数のファイルを同じ...
-
エラー 'dir.h' : No such fi...
-
ディレクトリ名を取得したい
-
dos変数の%~dp0は powershellで...
-
一定時間が経過したフォルダの削除
-
find関数が1階層(カレントディ...
-
複数ファイルの読み込みについて
-
ディレクトリ内CSVデータをすべ...
-
テキストファイルの結合
-
perlのNet::FTPで、ファイルか...
-
ファイル名の変更
-
chdirがうまくできない
-
下のディレクトリ(3つ)に含ま...
-
コマンド「dir」の結果を、テキ...
おすすめ情報