HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0806
わからないテキストファイル読み込み10解決


わからない

リンク

2015/8/6(Thu) 11:35:33|NO.70521

テキストファイルそのものを読み込むことはできるんですけど・・・・
特定の1つのファイル名を指定せず、フォルダーを指定してその中にある
テキストファイルをすべて読み込むことは可能でしょうか?
またそれはどのようなものでしょうか?
初心者にもできますか?



この記事に返信する


スペース

リンク

2015/8/6(Thu) 11:47:58|NO.70522

dirlistという命令でディレクトリ一覧(つまりファイル一覧)を取得できます。



わからない

リンク

2015/8/6(Thu) 11:58:47|NO.70523

2回階層先のものを読み込むにはどうすればいいですか?
いまいちわかりません・・・・
そしてそれで表示されたものが複数あった場合読み込めばいいんですか?



kanamaru

リンク

2015/8/6(Thu) 13:05:48|NO.70525

二階層先なども読み込みたいのなら再帰関数を使う必要があります。
hspではできません。



aaaaa

リンク

2015/8/6(Thu) 13:26:57|NO.70526

できないのですね・・・



スペース

リンク

2015/8/6(Thu) 14:12:02|NO.70529

いやいやkanamaruさん何言ってるんですか。
dirlistでディレクトリのみ取得して更にdirlistを使えば何層先でも読み込めるのでは?



わからない

リンク

2015/8/6(Thu) 14:50:43|NO.70530

どっちが正しいことを言ってるのかわからない・・・・・・



スペース

リンク

2015/8/6(Thu) 15:33:52|NO.70531

名前を変えられると同一人物なのかどうかがわかりづらいので、統一していただけると幸いです。

まずdirlistですがユーザーリファレンス(HSPエディタでF1)で説明をご覧になられましたか?
軽く説明すると、dirlistはp3でディレクトリ取得モードというのを指定できます。
取得モードは0~7まであり、すべて書くと長くなるので書きませんが、
5を指定することでディレクトリのみを取得することが出来ます。
取得する場所はカレントディレクトリです。
カレントディレクトリとは指定されているディレクトリのことで、
chdirで位置を変更することが出来ます。

取得したデータの形式は1行毎にファイル名(フォルダ名)が入っており、
取得したファイル数はstatに代入されています。

ですが1つの変数に改行されて入っていると非常に使いづらいですよね。
ではどうすればいいかというと、notegetで1行毎に切り分けてやります。
このプログラムではbという変数に0行目のファイル名が入っています。

notesel a dirlist a,"*.*" ; カレントディレクトリの取得 mes a ; 内容の表示 noteget b,0 Dialog b

さて、ここまでがdirlistの簡単な使い方です。
次は応用編。二層先のファイルリストを取得する方法です。

簡単なプログラムの流れだけ説明します。
01:dirlistでファイルリストを取得
02:配列変数にファイル名を切り分けて代入
03:目的のディレクトリが存在するかをifやinstr等で調べる。
04:していたらまたdirlistで取得

大体こんな感じです。
後は窓月ららさんやGENKIさんやkanamaruさんや暇人さんがもっとわかりやすく答えてくれます!(丸投げ)



レノス

リンク

2015/8/7(Fri) 02:05:01|NO.70536

スペースさんの返信にある通り、やるべきことは次の2つです。
1. 指定されたディレクトリ以下の、すべてのディレクトリをみつける。
2. みつけた各ディレクトリで、dirlist _, "*.txt" を使ってファイルを探す。

2はただのループなので簡単。1を説明します。

(再帰関数を定義すれば短く書けますが、再帰関数はややトラップが多めですし、
ここではループとスタックを使う方法を説明します。)

まず、あるディレクトリ dir の真下にあるディレクトリは、dirlist 命令で次のように探せます。

// _ には適当な変数名を書く dirlist _, dir + "/*", 5

ここで発見した各ディレクトリについて、再び上と同じことをする必要があります。
つまり↑に書いた dirlist を何度も行うということなので、これをループします。(何回行うかは分からない)


repeat dirlist _, dir + "/*", 5 //略 loop

発見したディレクトリは保存しておく必要があります。配列変数 dir_stk に入れることにしましょう。
dir_stk は、「発見したけれど、まだその下のディレクトリを探していない」ようなディレクトリの一覧になります。

ループ1回につき1つのディレクトリを探すので、dir_stk が 1 短くなります。
最終的に dir_stk の長さが 0 になれば、検索完了。

ちなみにHSPでは配列を短くしたり長さ 0 にしたりできません。そのため dir_stk の長さを変数で管理しておく必要があります。


sdim dir_stk dir_stk(0) = dir_cur // 最初に探すディレクトリ dir_stk_len = 1 // 配列変数 dir_stk の長さを表すのに使う変数 repeat if ( dir_stk_len == 0 ) { break } //dir_stk から、ディレクトリを1つ取り出す (次にここを探すということ) dir = dir_stk(dir_stk_len - 1) dir_stk_len -- dirlist note, dir + "/*", 5 note_count = stat //dir 直下で発見したディレクトリが変数 note に入る //note のそれぞれを dir_stk に入れていく repeat note_count //d: noteの cnt 行目、とする (*) // これを dir_stk に追加する dir_stk(dir_stk_len) = dir + "/" + d dir_stk_len ++ loop loop

(*)の部分は
> 配列変数にファイル名を切り分けて代入
です。
split 命令という専用の命令もありますが、空("")の要素が出てきてしまうのには注意。
あるいは、getstr で切り分けていくという手もあります。これが一番効率的。



skyblue

リンク

2015/8/7(Fri) 09:45:46|NO.70539

dirlist2命令を使えば半自動で再帰的にファイル一覧を取得できます。



スペース

リンク

2015/8/7(Fri) 10:48:38|NO.70540

dirlist2なんて命令があったんですか・・・(´・ω・`)



ONION software Copyright 1997-2023(c) All rights reserved.