|
 |
|
2017/4/3(Mon) 16:29:02|NO.78853
いつもお世話になります。
以下のようなフォルダ(上段)とファイル(下段)があるときに、
ファイル/フォルダの有無に合わせて、2次元配列file_strの内容を変えたいです。
どのようにすれば良いでしょうか。
■フォルダとファイルの構成例
\取れた魚
さんま いわし あじ ひらめ
\取れた野菜
玉ねぎ 人参 キャベツ ねぎ
\取れた果物
りんご くり かき かぼちゃ
\夕飯の魚
さんま いわし あじ
\夕飯の野菜
玉ねぎ 人参 キャベツ
\夕飯の果物
りんご くり かき
■2次元配列と中身
file_str(n,0)=フォルダ名 ;(フォルダの数だけ格納)
file_str(n,1)=ファイル名 ;(フォルダの中からファイルをランダムで選んで格納)
■2次元配列の中身の条件 (やりたい事)
左と右のフォルダが存在する場合、右のフォルダのファイルを左のフォルダと同じにしたい。
但し、フォルダが存在しない場合や、同じファイルが無い場合はランダム
"取れた魚", "夕飯の魚"
"取れた野菜","夕飯の野菜"
"取れた果物","夕飯の果物"
;サンプル用データ作成(デスクトップにsampleフォルダを作成します)
フォルダ作成 = "取れた魚", "取れた野菜", "取れた果物", "夕飯の魚", "夕飯の野菜", "夕飯の果物"
ファイル作成 = "さんま","いわし","あじ","ひらめ","玉ねぎ","人参","キャベツ","ねぎ","りんご","くり","かき","かぼちゃ"
data_dir=dirinfo(0x10000);仮にデスクトップに作成
chdir data_dir
data_dir=data_dir+"\\sample"
dirlist a, "sample", 5
if stat = 0{
mkdir "sample"
chdir data_dir
repeat length(フォルダ作成)
mkdir フォルダ作成(cnt)
chdir フォルダ作成(cnt)
repeat length(ファイル作成)
bsave ファイル作成(cnt),a ;すみません全入りです。
loop
chdir ".."
loop
}
;メイン
randomize
chdir data_dir
dirlist フォルダリスト, "*.*",5
フォルダ数 = stat
sdim file_str,0,フォルダ数,2 ;配列定義
repeat フォルダ数
notesel フォルダリスト;変数をメモリノートパッドへ代入
noteget フォルダ名,cnt;メモリーノートからcnt番目のフォルダ名を取得
chdir data_dir+"\\"+フォルダ名
dirlist ファイルリスト, "*"
ファイル数 = stat
notesel ファイルリスト;変数をメモリノートパッドへ代入
noteget ファイル名,rnd(ファイル数)
file_str(cnt,0)=フォルダ名
file_str(cnt,1)=ファイル名
;↓条件に合わせて変換したい
mes file_str(cnt,0)+":"+file_str(cnt,1)
loop

| |
|
2017/4/5(Wed) 20:58:40|NO.78936
ちょっとやりたいことがよくわからないのですが、たとえば魚で言えば、「取れた魚」と「夕飯の魚」の
両方のフォルダをチェックし、両方に共通して存在するファイルの中から一つをランダムに選択する、
ということでしょうか?
あと、
>但し、フォルダが存在しない場合や、同じファイルが無い場合はランダム
これは、どこからランダムに選択するのですしょうか?
(フォルダが存在しないのなら選びようがないと思うのですが)
|
|
2017/4/5(Wed) 22:36:35|NO.78938
沢渡さま
ご返事ありがとうございます。
プログラム言語の能力不足に加えて、国語力不足で
意味不明な質問になってしまいました。
>両方に共通して存在するファイルの中から一つをランダムに選択
>フォルダが存在しないのなら選びようがないと
仰る通りでございます。
以下のスクリプトが私の思考を無理やり盛り込んだものです
コメントアウトしている部分で私の酷い思考を垂れ流しています。
もっと分かりやすくスマートに組みたいのですがこれが私の限界です。
各フォルダにファイルが全部入ってしまっている為、
実行しても何が何やら。。。
例えば、夕飯の魚フォルダの中をあじだけにして頂けると少しはマシかと…
余計に意味不明ですね。。m(__)m
;サンプル用データ作成(デスクトップにsampleフォルダを作成します)
フォルダ作成 = "取れた魚", "取れた野菜", "取れた果物", "夕飯の魚", "夕飯の野菜", "夕飯の果物"
ファイル作成 = "さんま","いわし","あじ","ひらめ","玉ねぎ","人参","キャベツ","ねぎ","りんご","くり","かき","かぼちゃ"
テーブル="夕飯の魚\n取れた魚\n夕飯の野菜\n取れた野菜\n夕飯の果物\n取れた果物"
変換前=""
変換後=""
data_dir=dirinfo(0x10000);仮にデスクトップに作成
chdir data_dir
data_dir=data_dir+"\\sample"
dirlist a, "sample", 5
if stat = 0{
mkdir "sample"
chdir data_dir
repeat length(フォルダ作成)
mkdir フォルダ作成(cnt)
chdir フォルダ作成(cnt)
repeat length(ファイル作成)
bsave ファイル作成(cnt),a ;すみません全入りです。
loop
chdir ".."
loop
}
;メイン
randomize
chdir data_dir
dirlist フォルダリスト, "*.*",5
フォルダ数 = stat
sdim file_str,0,フォルダ数,2 ;配列定義
repeat フォルダ数
選択番号=cnt
notesel フォルダリスト;変数をメモリノートパッドへ代入
noteget フォルダ名,cnt;メモリーノートからcnt番目のフォルダ名を取得
chdir data_dir+"\\"+フォルダ名
dirlist ファイルリスト, "*"
ファイル数 = stat
notesel ファイルリスト;変数をメモリノートパッドへ代入
noteget ファイル名,rnd(ファイル数)
file_str(cnt,0)=フォルダ名
file_str(cnt,1)=ファイル名
;↓条件に合わせて変換したい
変換前+= file_str(cnt,0)+":"+file_str(cnt,1)+"\n"
notesel テーブル
テーブル数 = notemax
repeat テーブル数/2
noteget 変換対象文字列,cnt*2
if instr(file_str(選択番号,0), 0, 変換対象文字列)<0/*:dialog "1次検索:"+file_str(選択番号,0)+"に"+変換対象文字列+"はありませんでした": */: continue
noteget 検索文字列,cnt*2+1
;dialog "1次検索:"+file_str(選択番号,0)+"に"+変換対象文字列+"がありました"+検索文字列+"を探します":
repeat 選択番号;選択番号までにある筈なので
if file_str(cnt,0)=検索文字列{
;dialog "2次検索:"+file_str(選択番号,0)+"に"+検索文字列+"がありました。ファイル名を"+file_str(変換番号,1)+"に変換します"
変換番号=cnt
chdir data_dir+"\\"+file_str(選択番号,0);フォルダに移動
exist file_str(変換番号,1);ファイルを探す
if strsize!=-1: file_str(選択番号,1)=file_str(変換番号,1);:dialog "ファイル変換"
chdir "..";元の位置へ
}else{
;dialog "2次検索:"+file_str(選択番号,0)+"に"+変換対象文字列+"はありませんでした"
}
loop
loop
変換後+=file_str(cnt,0)+":"+file_str(cnt,1)+"\n"
loop
mes 変換前
mes 変換後

| |
|
2017/4/6(Thu) 01:05:21|NO.78962
どうもお気を悪くされてしまったようで、気に障るような言い方だったでしょうか?
そうでしたら、失礼なことを言ってしまい、申し訳ありませんでした。
それでは、「やりたい事」を踏まえた上で、コードを組ませてもらいました。
「魚」「野菜」「果物」という言葉と「取れた」「夕飯の」という言葉を組み合わせて、
どういう役割があるフォルダなのかを判別しています。
実行すると、配列"food_cate"の中には「魚」や「果物」といった食品のカテゴリ名が、
"result"の中には、ランダムに選ばれた食品の名前が入ります。
#module
#defcfunc dir_exist str dirname //指定したフォルダが無い場合は0を返す関数
dirlist dummy,dirname,5
return stat
#global
data_dir=dirinfo(0x10000) //デスクトップを指定
chdir data_dir
//sampleフォルダがデスクトップに無い場合は、サブフォルダとアイテムを作成
if dir_exist("sample")=0 {
mkdir "sample"
chdir "sample"
//サブフォルダのリスト
sdim fol_name,0,6
fol_name="取れた魚","取れた野菜","取れた果物","夕飯の魚","夕飯の野菜","夕飯の果物"
//アイテムのリスト
sdim item_name,0,4,3
item_name(0,0)="さんま","いわし","あじ","ひらめ"
item_name(0,1)="玉ねぎ","人参","キャベツ","ねぎ"
item_name(0,2)="りんご","くり","かき","かぼちゃ"
a="item" //ファイルの中身
repeat 6
cnt0=cnt
mkdir fol_name(cnt0) //サブフォルダを作成
chdir fol_name(cnt0) //サブフォルダに移動
repeat 4
bsave item_name(cnt,cnt0\3),a,4
loop
chdir ".." //親フォルダに移動
loop
sdim fol_name,0 //これらの配列は不要なので破棄
sdim item_name,0
}
data_dir=data_dir+"\\sample" //以下、デスクトップのsampleフォルダをホームとする
//ここからメイン
randomize
//食品カテゴリリスト
sdim food_cate,0,3
food_cate="魚","野菜","果物"
//結果を入れるリスト
sdim result,0,3
//処理本編
repeat 3
chdir data_dir
a="取れた"+food_cate(cnt)
b="夕飯の"+food_cate(cnt)
if (dir_exist(a)=0)|(dir_exist(b)=0) {
//「取れた○○」「夕飯の○○」というフォルダが無い場合
result(cnt)="(フォルダなし)"
continue
}
chdir a //「取れた○○」に移動
dirlist file_list,"*.*",1 //ファイル一覧を取得
if stat=0 {
//ファイルが無い場合
result(cnt)="(取れた食品はなし)"
continue
}
items=stat //「取れた○○」フォルダに入っていたアイテムの数
//「夕飯の○○」フォルダに移動し、「取れた○○」と共通するファイルがあるかどうかを調べる
chdir "..\\"+b //「夕飯の○○」に移動
notesel file_list
x=0 //ファイル一覧のうち、現在どこをチェックしているのか
repeat items
noteget tmp,x
exist tmp
if strsize=-1 {
notedel x //ファイルが存在しない場合、一覧から現在チェック中のアイテムを削除
} else {
x++ //ファイルが存在する場合は、次のアイテムへ
}
loop
items=x //両フォルダに共通するファイルの数。
//この時点でxは、「ファイルが存在する」という判定が起きた回数をあらわしている。
if items=0 {
result(cnt)="(夕飯の食品はなし)"
continue
}
//dialog file_list //デバッグ用
//アイテムを選択
noteget result(cnt),rnd(items)
loop
//後始末
noteunsel
chdir data_dir
//結果表示
repeat 3 : mes food_cate(cnt)+":"+result(cnt) : loop

| |
|
2017/4/6(Thu) 05:38:45|NO.78964
>どうもお気を悪くされてしまったようで、気に障るような言い方だったでしょうか?
いえいえ、全く微塵もそんなことはないです、
こちらこそ誤解を招く表現があったようで申し訳ないです。
サンプルありがとうございます。
確認してみます!
|
|