任意のディレクトリ構造を分析してその構造(ファイル名をkey)をXMLなりハッシュに吐き出すことができるモジュールなり方法を模索しています。
XMLでいうXML::Simpleみたいなものです。
参考------------------------------------------------------
【XML分析:XML::Simple】→【ハッシュ:Data::Dumper】
【XML分析:XML::Simple】→【XMLファイル:XML::Simple】
----------------------------------------------------------
グーグルなどで検索してみた限りでは、任意のディレクトリ内分析をしてくれてXMLなりハッシュに吐き出してくれるモジュールはなさそう。
そこでFile::Pathを使ってディレクトリ内を洗ってその構造を動的にハッシュにしたいと考えいます。しかし残念なことに予め構造がわかっている規則的なデータを動的にハッシュにすることはできるのですが、実際に分析するまでその階層すらわからない不規則なツリー状のデータ構造を動的にハッシュ化するプログラミング能力を持ち合わせていません。
そこで質問しかないということになりました。ぜひお知恵をお借りしたいと思っています。よろしくお願いいたします。
本当に簡単ですがこのような不規則なディレクトリ構造を動的にハッシュにしたいと思っています。この例ではディレクトリ構造がわかってますが、分析するまでわからないものとしてみて頂ければと思います。
test1(dir)―――――test2(dir)――――――――data1.txt(file)
| |
―data1.txt(file) ―data2.txt(file)
|
―data2.txt(file)
$test1 = {
'test2' => {
'data1' =>
{
'path' => 'test1/data.txt',
'parent_dir' => 'test2'
},
'data2' =>
{
'path' => 'test2/data.txt',
'parent_dir' => 'test2'
},
},
'data1' =>
{
'path' => 'test1/data.txt',
'parent_dir' => 'test1'
},
'data2' =>
{
'path' => 'test2/data.txt',
'parent_dir' => 'test1'
}
};
No.3ベストアンサー
- 回答日時:
仕上がりの構造を分かりやすくしてみました。
my $dom = { '/path' => '.' };
my @dir = ($dom);
while ( my $dir = shift @dir ) {
opendir( DIR, $dir->{'/path'} );
my @path = split( '/', $dir->{'/path'} );
my $current_dir = pop @path;
my $parent_dir = pop @path;
while ( my $path = readdir(DIR) ) {
next if ( $path =~ /^\.\.?$/ );
my $full_path = "$dir->{'/path'}/$path";
$dir->{$current_dir} ||= [];
if ( -d $full_path ) {
push( @dir, { '/path' => $full_path } );
push( @{ $dir->{$current_dir} }, $dir[-1] );
}
else {
push(
@{ $dir->{$current_dir} },
{ 'file_name' => $path,
'full_path' => $full_path,
'current_dir' => $current_dir,
'parent_dir' => $parent_dir,
}
);
}
}
delete $dir->{'/path'};
closedir DIR;
}
# 動作確認(モジュールがないときはインストールしてください)
use Data::Dumper;
print Data::Dumper->new( [$dom] )->Indent(1)->Sortkeys(1)->Dump;
exit;
返信ありがとうございました。
動作確認いたしたました。私より数段上の実力の方とお見受けいたしました。ありがとうございます。
初見の書き方もあって正直わからない部分もありますが、この質問をするまでかなり検索で調べたのですが、なかなか糸口がみつからず・・・あきらめかけていました。
書き方の取っ掛かりが見つかりました。これから一個ずつ動作チェックしながら勉強します。ありがとうございました。
No.2
- 回答日時:
再帰的に追加するロジックでそれっぽく作ってみました。
my $dom = { 'path' => '.', 'list' => [] };
my @dir = ($dom);
while ( my $dir = shift @dir ) {
opendir( DIR, $dir->{'path'} );
while ( my $path = readdir(DIR) ) {
next if ( $path =~ /^\.\.?$/ );
my $long_path = "$dir->{'path'}/$path";
if ( -d $long_path ) {
push( @dir, { 'path' => $long_path, 'list' => [] } );
push( @{ $dir->{'list'} }, $dir[-1] );
}
else {
push( @{ $dir->{'list'} }, $path );
}
}
closedir DIR;
}
$dom にファイル構造が入ってます。
ただし、私の独自の構造でいれていますのでご了承ください。
No.1
- 回答日時:
規則がまるでわかりません。
たとえば
'test2' => {
'data1' =>
{
'path' => 'test1/data.txt',
'parent_dir' => 'test2'
は
んなんで path => 'test1/data.txt'になるのでしょうか?
test2の下にいて、ファイル名はdata1.txtなのに。
いずれにしろほとんど組んでくださいとしか読めない質問なので
答えようがないです。
→'path' => 'test1/data.txt',
の部分は申し訳ないです。見落としました。空白を入れて整形しているときに誤ってペーストしてしまいました。
この掲示板では修正ができないので・・・。
→規則がまるでわかりません。
申し訳ない。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux Linuxについて質問です。 以下のような設定をしたMakefileを作成するにはどう記述すればよい 1 2023/02/03 20:10
- Mac OS PATHを使ってcdなどで簡単に移動できるようになりたい 3 2023/05/13 14:22
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- XML XML同じ名前の要素を自動で集約するツール 1 2022/04/11 09:21
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- AJAX 自作の地図をグーグルマップのようにしたい 3 2022/11/15 11:53
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ディレクトリ名を取得したい
-
batファイルでrenameができませ...
-
readdir()で得られるファイル・...
-
vba dir の相対パス
-
ディレクトリツリーの表示
-
VBAでCSVファイルの特定行を書...
-
awkスクリプトでダブルクォーテ...
-
close()で例外が投げられる理由
-
VBAでCSVファイルを途中行まで...
-
window.open でのファイル指定方法
-
エクセルVBA コードが同じでも...
-
perlのcdについて
-
MATLABのm-fileについて
-
PerlからのCSV出力
-
バッチファイルの作り方(CSV→...
-
Firefox で file:// で始まる U...
-
fopenでディレクトリ内の全ファ...
-
Perl cgiの文字化けを直したい ...
-
PerlでのUseless use...
-
htmlから、ファイル、もしくはC...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
batファイルでrenameができませ...
-
FindFirstFileとFindNextFileで...
-
readdir()で得られるファイル・...
-
vba dir の相対パス
-
Windowsで複数のファイルを同じ...
-
dos変数の%~dp0は powershellで...
-
Perlで フォルダ内の全て...
-
下のディレクトリ(3つ)に含ま...
-
ディレクトリ名を取得したい
-
パスから最後のディレクトリだ...
-
C言語でファイル名を取得
-
makefileでファイルをコピー(...
-
正規表現で、特定のファイル名...
-
複数ファイルの読み込みについて
-
ディレクトリの判別
-
サーバーにある特定の拡張子フ...
-
ディレクトリ構造の表示
-
LinuxのC言語で、ファイル名の...
-
ファイル名と更新日付の取得に...
-
ディレクトリツリーの表示
おすすめ情報