--------------------- [番外2] 一行野郎(FOPEN) --------------------------
はじまり、はじまり~。
<で、次はぁ。これ! コレがいい!!>
「FOPENでのファイル表示」?またとんでもなく長いものを・・・しかも終了&あきらめているしぃ。
古いものをほじくり返すんじゃない!!
<でへへ、アンタならどう対応するか見てみたい。>
スル~です。
<ダーメン!>
新種のラーメンっか。
<どうして?>
だいたい、「FOPEN後の処理を目視したいのですが、ファイルを表示出来ません。」>>仕様です。
コレで話は終わりのはず。最終目的をハッキリさせないから二転三転するんだよね。
<テキストファイルをまとめて置換えしたいのでは?>
目視はどこへ行った?
置換えするにしても何をどのように? 具体的な事が何も分からない。
<それはテキトーで良いんじゃない?>
なら何が問題?
<テキスト連結なんじゃ?>
秀丸マクロで連結してると言ってるよ。
<じゃぁEXCELから、サブフォルダ名を読み込む所では?>
スクリプトを見る限り出来てますな。
<じゃあ何が問題?>
私が聞いているんですけど。
<確かによーわからんわ。>
だろ?
<でも、そこは雰囲気で何とか>
って超アナログな。まあ長い問答があったので何となく感じ取れるが。
<それよ、それ。でスクリプトは?>
あせっちゃダメだよ。若くないんだし。
<ぶー。ぶぅー>
多分、スクリプトは出来たけど不安定なんで、FOPENでも使って内容を確認したいってとことだろ。
<でも結局出来なかったわけね。>
「秀丸で複数のマクロを順次処理」なら秀丸オンリーで頑張れば良い様に思う、内容を読んで
表示させれば、「目視」も出来るしね。
<じゃあ何故UWSCを使うの?>
秀丸ほどの優秀なマクロでも、Excelや他のアプリの操作は苦手と言うことさ。
<なるほど!>
もちろん出来ないわけではないと思うけれど、手軽じゃないんだね。
<それはUWSCでも同じなんじゃないの?>
そんな面倒な操作の自動化の為にUWSCは有る気がする。
<でも、UWSCを使っても大変そう>
確かに、目的が曖昧な上に、こう言った場合は構造自体に問題がある場合が多い。
<構造自体に問題って?>
ケースバイケースだが、例えば、取り合えず書き込んでおいたデータをその場限りで使う場合など。
<それで良いじゃん>
それらデータの多くは、統一性がなくバラバラで何の関連性もない。
<今回は仕方ないじゃないの?>
データの活用をあれこれ考えるより、見直した方が良いじゃないの?
<具体的にはどうゆう事?>
今回の場合だとExcelのデータは要らないのでは?
<へっ? 何で? >
ちょっと考えれば分かるけれど「全部のサブフォルダ名」ってあるよね。
普通、一括で処理したいデータがある場合は、どうやってしまって置く?
<フォルダを作って、その中に全部のサブフォルダを入れるわ?? そっか~一箇所にまとめるわよね普通。>
だろ? だからそのメインフォルダの中を階層も含めて探すことが出来れば、Excelのデータは必要ない。
<確かに、クソ重いExcelを使わなければ、安定するし、その操作も必要ないけどそんなこと出来るの?>
<フォルダ探査なんて、だいぶ以前に再帰を使ってやってたみたいだけれど、もう忘れたわ・・・>
正攻法だね。
<そっか~さすがのアンタでも、今回は無理だったというワケね>
ファイル操作に関しては、便利なコマンドが用意されているのだが、GUI全盛の今の時代には、
それこそ気づかない人も多いのでは?
<でも結局無理なんでっしょUWSCで書くのは>
ああ、無理かも知れないね一行で書くのはちょっとね。
<な~~に馬鹿なこと言ってんの! 一行で書けるわけないに決まってんじゃん!もう。>
<フォルダ探査して、連結して、表示させんのよ!! ハアハアぁ。 興奮して血圧が上がるわ。>
な~んだ一行でなくても良かったんだ。 もう書いちまったじゃねーか。
<ハアァ~~ん?? どうゆう事?私と話している内に書き終わったって言うの? 一行で??>
うん♪ 話が長すぎだよ。
<ああっ神様!! 悪魔の申し子であってもお許しください。この子に罪はないのです。>
<この大嘘つきは、私があまりにも、スクリプトを強制したばかりに、つい出来心なのです>
<全ては、この私が悪いのです。なにとぞご慈悲をぉぉ~~~バタン!>
気を失うほどの懺悔だったな。てか私は、悪魔の申し子で大嘘つきの犯罪者ですか?
<違うの?>
違います。
<証拠が必要よ>
コレだけど。
dm = DOSCMD("type > c:test.txt & for /R c:test %V in ( *.txt ) do copy c:test.txt + %V c:test.txt") + exec("notepad c:test.txt")
<ああっ神様!!・・・>
コラコラッ。
<だってこんなの見たことないよ。お兄ちゃん。>
妹モードですか。コレはテストフォルダ以下のテキストファイルを探査連結し表示させる。
<実行してみてよ♪>
いいよ。ちょうど掲示板ログをまとめようと思っていたところだ。ポチ!
<な、なにぃ!! 全過去ログが数秒で表示だとぉ~~~! ムッチャ速っ!>
<ちょ、ちょっと待ってよ! 何よコノ速さ、短さは・・・しかもスクリプト完成までノータイムですってぇ?>
一行だから当然だね。
<カラ~~ン。コロコロコロ。 オットト。>
なんか落ちたよ。
<天使の輪。天使の輪・・・>
天使の輪って着脱式だったんだ。
<私、噂で聞いたことがある。質問内容全てを、たった一行で実行する脅威のスクリプトがあるって!!確か「配列マジック」とか何とか・・・>
<ソレ聞いたとき、絶対ヤラセだと思ってた。なのに前回といい、今回といい目前で展開されているコレは何?>
<噂以上の凄さだわ。 こ、こんな私が選んだ質問を一行スクリプトの連発で当たり前のように・・・>
んっ何か言った?
<アンタひょっとして「配列マジック」って書いたことある?>
あっ! アレネ。ごめんね。あの時はマルチステートメントを使ってしまって。お詫びに真・一行スクリプトを追加したはずだが。
<ん? マルチステートメント? 当然使っているんじゃ・・・ えっ★※■・・・>
<ま、まさかぁ 完全な一行だったなんて、あまりの複雑な処理に当然使っているものと・・・まさに奇跡!>
<今わかったわ! コレがLiners = 一行野郎たる由縁なのね。>
そうゆうこと。
おしまい。
-----------------------------------------------------------------------------------------------
提供は: 一行野郎 = Liners でした。
-----------------------------------------------------------------------------------------------
FOPEN でのファイル表示 KRT
FOPEN後の処理を目視したいのですが、ファイルを表示出来ません。
簡単な例ですが、
ID = FOPEN("C:test.txt", F_READ or F_WRITE)
FPUT(ID, "hello", 0)
SLEEP(2.0)
FCLOSE(ID)
FPUTの所で、色々な処理をしたいのですが、
ファイルが表示出来ないので、OK時の結果しかわかりません。
他のファイルオープン方法は、記述が悪いせいか不安定なので、
FOPENが表示出来れば、初心者には便利です。
宜しくお願いします。
DATE:2010/9/16(Thu) 18:38 No.3223
RE:FOPEN でのファイル表示 Outliner
ヘルプにある通り、FPUTで実際にファイルが更新されるのはFCLOSEが呼ばれたときになります。
ファイルの内容を変数に入れて、その中で処理をするか、処理ごとにFCLOSEするとかでしょうか。
DATE:2010/9/20(Mon) 09:51
RE:FOPEN でのファイル表示 KRT
Outliner さん
アドバイス有難うございます。
"ファイルの内容を変数に入れて"というのをトライしてみます。
FOPENを使って、ファイルをvisibleにするのは簡単ではなさそうですね。
結構サーチしましたが、それらしきものが見つからず。
秀丸で複数のマクロを順次処理する、のをやってますが、同一の対象ファイル・マクロファイル・処理でも、途中で止まるケースが多く、安定しません。メニューやショートカットキーからファイルを開いてますが、FOPENでパス指定をすればどうかな、と思った次第です。
試行錯誤してみます。
DATE:2010/9/20(Mon) 11:00
RE:FOPEN でのファイル表示 眠たい詩人
// こういうこと?
ID = FOPEN("C:test.txt", F_READ or F_WRITE)
for i=1 to 10
FPUT(ID, i+"回目のhello", 0)
msgbox("---ファイルの先頭---<#CR>"+FGET(ID, F_ALLTEXT)+"<#CR>---ファイルの末尾---")
next
FCLOSE(ID)
DATE:2010/9/20(Mon) 14:21
RE:FOPEN でのファイル表示 KRT
眠たい詩人 さん
有難うございます。色々と勉強になります。
この投稿で、FPUTの所で、実際にやっている事は、
1) EXCELから、サブフォルダ名を読み込む
2) 各サブフォルダ内の全テキストファイルを、秀丸マクロで連結し、保存
3) その後、別の.uwsファイルで、連結したファイルを、秀丸マクロでGREP置換しています。
具体的に、実際のコードを投稿しようと、少し清書したら、
うまく作動しなくなりました。
原因が見つからず、念の為2個目以降のファイルを処理すると、
すんなり作動、数件処理するとまたストップ。
安定しない状態なので、試行錯誤してみます。
全行程フルオートになると最高ですが、難しいかな、と思ってます。
DATE:2010/9/21(Tue) 01:13
RE:FOPEN でのファイル表示 Outliner
全行程フルオートは可能だと思います。
私がやるとしたら
1) EXCELから、サブフォルダ名を読み込む
ここで全部のサブフォルダ名を読み込んでしまう。
2) 各サブフォルダ内の全テキストファイルを、秀丸マクロで連結し、保存
サブフォルダ内のテキスト連結はUWSCで行ってしまう。
3) その後、別の.uwsファイルで、連結したファイルを、秀丸マクロでGREP置換しています
ここも内容によりますが、UWSCだけでやってしまった方がいいように思います。
ストップする原因は、秀丸マクロなどの処理が終わったかどうかの判定ができていないとか、判定できずに処理中の秀丸を操作しようとしてしまうとかではないでしょうか。
// 参考まで、フォルダ内のテキスト連結
ディレクトリ = "C:~~~~~"
TEXT = ""
newFName = "連結したText.txt"
ファイル数 = GETDIR( ディレクトリ)
for x=0 to ファイル数-1
FName = ディレクトリ+""+GETDIR_FILES[x]
if 0=POS( ".txt", FName,-1) then CONTINUE
idf = fopen(FName,F_READ)
TEXT = TEXT +"<#CR>"+ FGET(idf,F_ALLTEXT)
fclose(idf)
next
idf = fopen(newFName,F_WRITE or F_WRITE or F_NOCR)
fput(bak,TEXT )
fclose(idf)
DATE:2010/9/21(Tue) 01:59
RE:FOPEN でのファイル表示 KRT
Outliner さん
貴重な助言、本当に有難うございます。
基本が解ってないので、ネットから探して加工、している状態です。
1.ここで全部のサブフォルダ名を読み込んでしまう。
なるほど、なのですが、配列が出来ずににいます。
2.サブフォルダ内のテキスト連結はUWSCで行ってしまう。
配列が出来れば、トライします。
自作でサブフォルダ1個のみの処理を一見出来ましたが、テキストの中身が完全にコピーできてませんでした。
3. ここも内容によりますが、UWSCだけでやってしまった方がいいように思います。
ご助言の通りなのかと思いますが、いかんせん、スクリプトを書くのが、私では多分無理です。
なるべく既存のツール(秀丸・Excelマクロ等)を使って分断作業、手作業を入れながら、
なるべくuwscを司令塔にして、少しでも楽に・ミスなく出来れば、と思います。
4. ストップする原因は、秀丸マクロなどの処理が終わったかどうかの判定ができていないとか、
判定できずに処理中の秀丸を操作しようとしてしまうとかではないでしょうか。
REPEAT - UNTILを入れたのですが、各ファイルのサイズ等により、順番がずれるのかな、と思います。
全く同一の処理でも止まる時も結構あります。
一度止まると、しばらくその現象が続いたり、変更前にOKだったuwscに問題が出る事も。
Pro版のDebaggerや、全ウインドウのタイトル出力とかで、探しましたが。。
uwscの次ぎのステップを手作業でクリックすると再開する場合が多いので、良しとしようかな、と思います。
5. スクリプト、有難うございます。
Outlinerさんのプログラムをそのまま実行すると、
" 変数: BAKが定義されていません。18行目: fput(bak,TEXT )"
と出てしまい、対処がまだわかりません。
以下、FOPENでトライ中のスクリプト(A)です。
EXCELでの配列処理、FGETのコピーが不完全、等、何かアドバイスを頂ければ幸いです。
XLGETDATAのヘルプ等も見ましたが、まだ使えてません。
FOPENを使わないスクリプト(B)も、ついでに添付します。
何故か、以前より悪化して、よく止まります。通しでうまく行くのは、サブフォルダ5個位です。
こちらはファイルを開く・保存等が不安定なので、無理矢理、空のスタートファイルを作り、
パスの指定を回避しています。
//(A)FOPENでのファイル連結
//変数 = !%%!ファイル名
+ FGET(ファイルID, F_ALLTEXT (-2), FALSE)
RUN = 0
ALLTEXT = "!%%!" //区切記号(各ファイル)
FID = ""
FPATH = ""
DIM DIR()
EXCEL = GETACTIVEOLEOBJ("EXCEL.Application","Microsoft Excel - uwsc.xlsx")
EXCEL.visible = True
YSTART = EXCEL.ActiveCell.Row
y = YSTART
WHILE RUN <> ""
RUN = Excel.ActiveSheet.Cells[y,1].Value
DIM DIR[i] = Excel.ActiveSheet.Cells[y,4].Value
PRINT "DIR" + y + "=" + DIR
y = y + 1
RUN = Excel.ActiveSheet.Cells[y,1].Value
IFB RUN = ""
YEND = y
KAISU = YEND - YSTART
BREAK
ENDIF
WEND
For j = 0 To KAISU -1
//Dir = Dir[j]
For i = 0 To GetDir(Dir[i]) - 1 // ファイル
FPATH = GETDIR_FILES[i]
FID = FOPEN(DIR + "" + FPATH)
FTEXT = FGET(FID, F_ALLTEXT,FALSE)
ALLTEXT = ALLTEXT + "<#CR>!%%!" + FPATH + "<#CR>" + FTEXT + "<#CR>"
FCLOSE(FID)
Next
j = j + 1
//区切記号(各サブフォルダ)
ALLTEXT = ALLTEXT + "<#CR>#############<#CR>"
Next
EXEC("C:Program FilesHidemaruHidemaru.exe")
SENDSTR(GETID("無題"), ALLTEXT)
EXITEXIT
///////////////////////////////////////////////////////////////////////////////////////////////
//(B)
EXCEL = GETACTIVEOLEOBJ("EXCEL.Application","Microsoft Excel - uwsc.xlsx")
EXCEL.visible = True
y = EXCEL.ActiveCell.Row
RUN = 0
//メインフォルダ内に、ダミーで作ったスタートファイルを事前に開く(パスを使わない方法)
FILE1 = "000_uwsc.txt" //メインフォルダ内
//各サブフォルダに、ダミーのスタートファイルを作り、まずこれを呼び出してから、連結処理
FILE2 = "000_ファイル連結開始.txt"
WHILE RUN <> ""
sleep(0.1)
RUN = Excel.ActiveSheet.Cells[y,1].Value
FN = Excel.ActiveSheet.Cells[y,3].Value //サブフォルダ名
//開く
id = GETID(FILE1, "Hidemaru32Class", -1)
SLEEP(1.0)
SCKEY(id, VK_ALT, VK_F, VK_O)
id = GETID("ファイルを開く", "#32770", -1)
CLKITEM(id, FN, CLK_LEFTCLK)
CLKITEM(id, "開く(O)", CLK_BTN)
CLKITEM(id, FILE2, CLK_LEFTCLK)
CLKITEM(id, "開く(O)", CLK_BTN)
ID = GETID(FILE2, "Hidemaru32Class", -1)
SCKEY(ID, VK_CTRL, VK_8)
SLEEP(1.0)
id = GETID("§ ファイルの結合 § Ver1.01", "#32770", -1)
SLEEP(1.0)
SCKEY(ID, VK_ALT, VK_A)
SLEEP(1.0)
REPEAT
SLEEP(0.1)
ID = GETID("grep", "Hidemaru32Class", -1)
UNTIL ID > 0
CLKITEM(ID, "●この順序で連結実行● (中止はエスケープキー)", CLK_ACC or CLK_BACK or CLK_MUSMOVE)
KBD(VK_RETURN, CLICK, 5)//ここで時々止まるようになってしまった(以前はOK)
REPEAT
SLEEP(0.1)
id = GETID("秀丸エディタ", "#32770", -1) //処理完了、ここでも時々止まる
UNTIL ID > 0
SLEEP(0.1)
CLKITEM(id, "OK", CLK_BTN)
SLEEP(1.0)
ID = GETID("連結.txt")
SCKEY(ID, VK_A)
//CLKITEM(id, "名前を変えて保存", CLK_ACC or CLK_BACK or CLK_MUSMOVE)
//CLKITEM(id, "このまま保存", CLK_ACC or CLK_BACK or CLK_MUSMOVE)
ID = GETID("名前を付けて保存", "#32770", -1)
CLKITEM(ID, "デスクトップ", CLK_LIST)
SLEEP(0.1)
SCKEY(id, VK_ALT, VK_N)
SENDSTR(id, FN + "-連結", 1, True)
SLEEP(0.1)
CLKITEM(id, "保存(S)", CLK_BTN)
SLEEP(0.1)
//連結ファイルを閉じる
id = GETID(FN + "-連結", "Hidemaru32Class", -1)
SCKEY(id, VK_ALT, VK_F, VK_E)
SLEEP(0.1)
//サブフォルダのスタートファイルを閉じる
id = GETID(FILE2, "Hidemaru32Class", -1)
SCKEY(id, VK_ALT, VK_F, VK_X)
SLEEP(1.0)
y = y + 1
WEND
EXITEXIT