第1話 複雑な処理ですが

--------------------- 第1話 複雑な処理ですが --------------------------

はじまり、はじまり~。

<キャッホ~! 久しぶりね♪ 今回はどんなんかな!ドンなんかな!>
いつにも増してハイだな。クスリでもやっているのか?

<デヘヘ! 天使にクスリは効きません。最近冗談の質が落ちたわね。>
マジなんだが。まあシラフでラリってるような奴だからな。

<何か言いました?>
空耳です。

<で「複雑な処理」って?>
前置きなしだな。
コレは私が言っているのではなく質問者自身が言ってるんだよ。

<な~んだ、じゃあ~「複雑な処理」じゃないかも知れないじゃん!>
確かに。でも他の回答者も一からスクリプトを組んでみる気はないらしい。

<とっても「複雑な処理」じゃん!>
オイ!私の意見は無視かよ。

詳細は下記を参照していただくとして、要はテキスト内ブロックの第2フィールドを
繋げたい。という事みたい。

色々問答があった末に、質問者にテスト・スクリプトを提示してもらった訳だが
コレが動かないし、ブロック抽出すら出来ていない。

<そんなもんじゃないの?分からないから質問しているんだからね。>
おっ、今回はいやに優しいね。

<い、いつもの事ですわ"ぁょ>
なれない言葉を使おうとするから舌を噛むのだよ。
それでも、提示してくれたお陰で、二転三転していた質問内容が明確になった。

そうだな~私も一から組む気はないから、コアな部分だけを出来るだけ短く
してみるかな。

<やっとやる気になったわね。えっとオリジナルわぁコメントを除いて12行で>
<確認用のmsgboxを抜いて10行ってとこね。今回はファイル処理だから短くするのも>
<限界があるわね。fopen,fclose,抽出(pos,repeat,until),msgbox・・・6行か...>

<じゃあ今回は6行で許してあげる>
6行? "cccdddeeefffggghhhiii" と表示するまで?

<何バカなこと言ってるの! ブロック表示をするまでよ。>
<コマンドを一つずつ書いたって6行かかるんだからね。>
<しかも、まとめにくいコマンドだから6行でも無理だわね>

な~んだブロック表示までなら一行だね。

<ったく...限界突破というか、気が狂ったというか・・・>
<オリジナルの十分の一ですって!!本当なら証拠を見せて!>
ホレ!

<グッ! こ、これわぁ・・・・・>
勉強不足だったようだね。


----------------------------------------------------------------------

提供は: とっても「複雑な処理です」が、一行ですが!(ブロック表示までですが) Linersでした。

----------------------------------------------------------------------
以下実際の掲示板

複雑な処理ですが 花鳥風月


回答ありがとうございます。
①Getdir()の戻り値で試してみます
②すいません。説明不足でした。
行いたいことは、大量のログファイルを1ファイルずつ開き
 1、ファイル名をPOS関数で探します
 2、「30:」をpos関数で探し、上記のpos関数の戻り値以上の場合以下の処理を行う
 3、「30:」の次の文字から70バイトをコピー
次の行も同じ位置なのですが同じ行をコピーできませんか?

例えばログファイルに
   XXXファイル
 01(スペース2個)aaa(スペース2個とエンター)
 02(スペース2個)bbb(スペース2個とエンター)
 03(スペース2個)ccc(スペース2個とエンター)
 エンター
 の場合、①でXXXファイルを検索(XXXファイルは1つなので)
     ②で01を検索(他にも01はたくさんあるとして)
     ③でaaabbbcccのレコードを作成
     ④04の箇所がエンターなので次のファイルへ(04も他の箇所には存在)


DATE:2007/6/27(Wed) 21:10

 


RE:GETDIRとGETDIR_FILES ZEROSAM


う~ん・・・これを作ってくれという要望であれば難しいのでは?
技術的にではなく、初めから作るのが面倒だと思われてしまいます。(少なくとも私はそう思いました。)
トライしたスクリプトくらいは載せましょう。

>またTXTを開かずに取得することは可能でしょうか?
トリッキーな方法を載せます。
ただし、きちんとしたスクリプトを作成するのであれば、しろまささんも指摘している通り、FOpenを使ってください。
あくまでデバッグ用などで利用価値のある方法として参考にしてください。

//[サンプル]
//C:のディレクトリリストをテンポラリに保存
DOSCMD("dir c: > %temp%dirlist.txt")

//ファイル内容を読み取り(読み取りだけしたい場合はここだけ使う。)
//コマンドは"TYPE ファイル名"
strRet = DOSCMD("type %temp%dirlist.txt")

//ファイル削除
DOSCMD("del %temp%dirlist.txt")

print strRet


DATE:2007/6/28(Thu) 00:47

 


RE:GETDIRとGETDIR_FILES ラシャン


例のようにファイル名以降が全て同じレイアウトなのであれば
ファイルを開いて、指定行までスキップしてから最終行までループしながら
BETWEENSTR関数でスペース2個で囲まれた部分を抜き出したり出来そうですね
あくまで実際のログファイルと例が同じであればですが^^;

ちなみに、花鳥風月さんが行いたい事というのは、1つのログファイル内にある
スペース2個で囲まれた部分を抜き出し、連結してレコードを作成したいのでしょうか?
それとも、ファイル名の開始位置より後ろに「30:」がある場合のみ「30:」の終了位置から
70バイト分抜き出し、連結してレコードにしたいのでしょうか?

実際のログファイルのレイアウトが分かれば、簡単な方法が見つかるかもです。
差し支えない程度に編集して載せてもらうことは可能ですか?

DATE:2007/6/28(Thu) 00:56

 


RE:GETDIRとGETDIR_FILES Liners


質問内容が十分に理解できません。番号との対応を一対一にして、用語を区別してください。
トライしたスクリプトがあると理解が一気に進みます。複雑ならば、なおさらです。(ZEROSAMさんに同意)

ログファイルを開いた後の処理は、以下の理解でよいですか?(ラシャンさんの前半部分と同じ)

空行で区切られたテキストファイル(ログファイル)で、ブロックの先頭行にファイル名(タイトル行)があり、
その後、半角空白2個で区切られたデータ行がn行有ります。(ブロックは複数存在する)
ファイル内の「XXXファイル」のブロックを検索し、データ行の第2フィールドを繋げた文字列を作りたい。

花鳥風月さんのスクリプトは文面から、たぶんテキストをメモ帳で開き一度に読込んで処理する方向で、
それが元ファイルとの兼ね合いで説明しづらいとだと思います。経験上複雑であれば有るほど、一行ずつ処理をするものです。

この方法なら>次の行も同じ位置なのですが同じ行をコピーできませんか?>出来ます。
ただ目的が明確でないので、(絞り込まれていないので)スクリプトを提示できないと言ったところです。

たぶん、トライしたスクリプトを載せれば、サンプル・スクリプトを提示してもらえるでしょう。

DATE:2007/6/28(Thu) 02:18

 


RE:GETDIRとGETDIR_FILES しろまさ


> 例えばログファイルに
>    XXXファイル
>  01(スペース2個)aaa(スペース2個とエンター)
>  02(スペース2個)bbb(スペース2個とエンター)
>  03(スペース2個)ccc(スペース2個とエンター)
>  エンター
>  の場合、①でXXXファイルを検索(XXXファイルは1つなので)
>      ②で01を検索(他にも01はたくさんあるとして)
>      ③でaaabbbcccのレコードを作成
>      ④04の箇所がエンターなので次のファイルへ(04も他の箇所には存在)

① FOpenでファイル内容全てを変数 S に読み込み
  TokenでSからXXXファイルをセパレーターとして切り出し
  Tokenで変更された S から改行をセパレーターとして切り出し
② 戻値から01を検索しあればTokenやBETWEENSTRで空白をセパレーターとして切り出し変数 T に格納
③ 上記を繰り返し、T を連結していく。
④ 終了条件は①の2つめのTokenの戻値が空になること。

花鳥風月さんの文面からアドバイス出来るのはここまでかなぁ。
後はHelpとにらめっこして頑張って下さい~。

DATE:2007/6/28(Thu) 06:32

 


RE:GETDIRとGETDIR_FILES 花鳥風月


回答・ご指摘ありがとうございます。
ログファイルは個人所有のものではないので
(個人情報などが含まれるので掲載できません・ご了承ください) 
テストしたのを掲載させていただきます

//スクリプト
//ファイルopen
fid=FOPEN("TEST1.log")
// ファイルの全内容をaにコピー
a = FGET(fid,F_ALLTEXT)
// ログファイルにあるXXXXXを検索
b = pos("XXXXX",a,1)
msgbox(b)
// bの次にある0:を検索
i = 0
REPEAT
i = i + 1
c = pos(" 0:",a,i)
UNTIL c > b
 msgbox(c)
// c = c + 4
d = copy(a,c,4000)
msgbox(d)
// SENDSTR(0,d)

//ログ
ZZZ
0: aaa

YYY
0: bbb
35: jjj

XXXXXX
0: ccc
35: ddd
70: eee
105: fff
140: ggg
175: hhh
210: iii

LLLLL
0: kkk
35: LLL

です。よろしくお願いいたします。
※0・35・70・・・の数値は固定です。
※この場合XXXXXXの0:から最後までコピーされます
※このスクリプトの場合、cccdddeeefffggghhhiiiを作成したい
※通常はaaaやbbbが70バイトありますが・・・。

DATE:2007/6/28(Thu) 06:41


RE:GETDIRと GETDIR_FILES ラシャン

こんな感じでどうでしょう?

開始行についてはDOSコマンドでXXXXXXがある行番号を取得して
その行番号+ファイル名がある行をスキップして処理します。
改行のみの行になったら処理を終了してレコードを表示します。
とりあえず、フォルダ内全てのログファイルに対して同じ処理を繰り返すようにしてみました。


////////////////////////////////////////////////////////////////////////////////
FILENAME="XXXXXX"
LOGFILE=GETDIR(GET_CUR_DIR,"*.log")
ifb LOGFILE = 0 then
msgbox("LOGファイルが見つかりません")
exitexit
endif
DIM DATA
for i = 0 to LOGFILE-1
SKIP = VAL(trim(doscmd("for /f <#DBL>tokens=1 delims=:<#DBL> %a in ('findstr /n "+FILENAME+" "+GETDIR_FILES[i]+"') do @echo %a")))
fid=FOPEN(GETDIR_FILES[i])
for ii = (SKIP+1) to FGET(fid,F_LINECOUNT)
if FGET(fid,ii) = "" then BREAK
DATA=DATA+BETWEENSTR(FGET(fid,ii)," "," ")
next
msgbox(DATA)
DATA=""
next
////////////////////////////////////////////////////////////////////////////////
DATE:2007/6/28(Thu) 19:25

RE:GETDIRとGETDIR_FILES 花鳥風月

回答ありがとうございます。
上記の方法で行ってみます。
多くの方を巻き込んですみません<m(__)m>
DATE:2007/6/28(Thu) 20:47