• ベストアンサー

バッチ処理でテキストから数値を取り出し、CSVにしたい

こんにちは。 似非SEです。 2度目の質問です。 現在、あるサーバのディスク容量の増減を管理するため、 以下のバッチをスケジューリングして、容量をファイルに 書き込んでいます。 -------------------------------------------------------- echo D:\ >> DS_D.txt date /t >> DS_D.txt time /t >> DS_D.txt dir D:\ | find "バイトの空き領域" >> DS_D.txt -------------------------------------------------------- 出力されるファイルは次のようになります。 -------------------------------------------------------- D:\ 2008/05/22 09:29 3 個のディレクトリ 39,870,087,168 バイトの空き領域 D:\ 2008/05/23 09:45 3 個のディレクトリ 39,870,087,168 バイトの空き領域 -------------------------------------------------------- 非常に簡単に容量がわかるのですが、これをグラフにするのに 手間がかかってしまっています。 <要望> 1.出力テキストから日付を取得 2.出力テキストから空き容量の数値を取得 3.csvファイルに落とす 出力ファイルは 2008/05/22[TAB]39,870,087,168[リターン] 2008/05/23[TAB]39,870,087,168[リターン] のようにできればベストです。 なにとぞ似非SEを助けて下さいませ!

質問者が選んだベストアンサー

  • ベストアンサー
  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.7

>もしお時間がありましたら、 >提示頂いたバッチの、各行でどのような処理を行なっているのか、 >初心者にわかるように教えていただけませんでしょうか? 簡単に説明しますね。 echo off … バッチ実行時に各行の表示を抑制します。 for /F "tokens=3" %%s in ('dir d:\') do set size=%%s … for /F で in() 内のファイル(今回の場合は''でくくっているので dir d:\ の実行結果)を1行ずつ処理します。"tokens=3" で1行の中で空白で区切られたトークン(文字列のかたまり)の3番目を %%s という変数に代入します。そしてdo 以降の記述を実行します。今回は set size=%%s なので、環境変数 size に各行の3番目のトークンを代入します。 dir d:\ を実行すると複数行の実行結果がありますよね。で、それぞれの行で環境変数 size に各行の3番目のトークンを代入(上書き)しますが、最終行が 3 個のディレクトリ 39,870,087,168 バイトの空き領域 ですから最終的にこの行の3番目である「39,870,087,168」の文字列が %%s に代入され、さらに環境変数 size に代入されます。 set size=%size:~0,-8% … %size:n,m% と記述すると、sizeという変数のn+1文字目からm文字分文字列を抜き出します。-mと書くと末尾m文字を除いた文字列を抜き出します。今回0,-8ですから1文字目から末尾8文字を除いた文字列を抜き出します。8文字というのは数字6桁とカンマ2文字の合計8桁分です。 echo %date%,"%size%">>DS_D.csv …%date% はこの行を実行した時の日付yyyy/mm/ddに置き換えられます。 %size% は環境変数 size の中身(この場合は39,870に置き換えられます) 詳しくはforとsetのヘルプをご覧下さい。 コマンドプロンプトで for /? set /? と入力するとヘルプが表示されます。

noname#67215
質問者

お礼

ここまで詳しく説明していただけると、 非常に助かります。 For文の使い方やTokenの使い方がよくわかっていなかったので 大変勉強になりました。 また、機会があればよろしくお願いします。 ありがとうございました。

その他の回答 (6)

  • iriyak
  • ベストアンサー率48% (40/82)
回答No.6

質問者は、要素技術の習得に積極的です。別の解法をメモしておきますので、ここで紹介する Awk の習得にぜひトライください。バッチだけの制約を緩められる条件下では Awk は有効です。 (概要) テキスト処理ツール Awk を用いて必要なデータを抽出、加工、出力する (処理の内容と実行の流れ) Awk の Windows 実装である GNU Awk を使用して、日付とサイズの抽出およびサイズ値を 1,000,000 で割って出力します。バッチから GNU Awk を起動して結果をファイルにリダイレクトします。GNU Awk は gawk.exe 単体があれば実行可。 (準備) GNU Awk をダウンロードし適当なディレクトリに格納します。 http://www.vector.co.jp/soft/win95/util/se376460.html 次に launch.bat の dir 変数を実行環境にあわせて修正する。 (プログラム) □launch.bat echo off set dir="C:\Program Files\UWSC\scripts\080522 AWK" set GAWK=%dir%\gawk.exe set SCRIPT=%dir%\extract.awk set INPUT=%dir%\DS_D.txt set OUTPUT=%dir%\output.txt %GAWK% -f %SCRIPT% %INPUT% > %OUTPUT% □extract.awk /^D:/ { getline # 2行目 d = $0 getline # 3行目 getline # 4行目 n = $3 gsub(/,/, "", n) n = n / 1000 / 1000 print d "\t" n } (実行結果例) C:\Program Files\UWSC\scripts\080522 AWK>type DS_D.txt D:\ 2008/05/22 09:29 3 個のディレクトリ 39,870,087,168 バイトの空き領域 D:\ 2008/05/23 09:45 3 個のディレクトリ 39,870,087,168 バイトの空き領域 C:\Program Files\UWSC\scripts\080522 AWK>launch.bat C:\Program Files\UWSC\scripts\080522 AWK>echo off C:\Program Files\UWSC\scripts\080522 AWK>type output.txt 2008/05/22 39870.1 2008/05/23 39870.1 C:\Program Files\UWSC\scripts\080522 AWK> (技術習得の道しるべ) プログラミング言語 Awk は、1977 年に生まれた息の長いテキスト処理系です。検索エンジンで Awk とすればマニュアル、チュートリアル、実装系一覧、など、ドキュメントリソースが豊富ですので、教材不足により、学習が思うように進まない心配はありません。 回答者の個人的なお薦め: プログラミング言語 Awk # ISBN-10: 4775302493 # ISBN-13: 978-4775302491

参考URL:
http://ja.wikipedia.org/wiki/AWK
noname#67215
質問者

お礼

ありがとうございました。 時間を見つけて学習してみたいと思います。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.5

Dim FSO, TXF, RYO, DRV Set FSO = CreateObject("Scripting.fileSystemObject") RYO = 0 '★容量を得るための初期化 For Each DRV In FSO.Drives   ' 固定ディスクの場合だけ空き容量を加算する   If DRV.DriveType = 2 Then RYO = RYO + DRV.AvailableSpace Next ' CSVファイルを追加モード(8)で開く。無ければ作る(True) Set TXF = FSO.OpenTextFile("C:\Temp\監視.csv", 8, True) ' 現在の日付を出力 TXF.Write Year(Date) & "/" & Month(Date) & "/" & Day(Date) ' 区切り文字を出力 TXF.Write "," '★タブを使いたい時は","→vbTabとする ' Mb単位にする(四捨五入)切捨てにしたい時はCLng→Intとする TXF.WriteLine CLng(RYO / 1000000) ' ファイルを閉じる TXF.Close 上記テキストを例えばHOGE.vbsとして保存し、バッチと同じように コマンドプロンプトからHOGEとキーインするか、エクスプローラで開けば 実行されます。尚、For~Nextの間のインデントは漢字空白なので、 半角スペースに代えてから保存してください。丸々コピペすると、エラーです。 上のやり方はExcelにマクロとして組み込むことが出来ます。 そうなると、バッチは不要になりますね。

noname#67215
質問者

お礼

再度の投稿ありがとうございます。 すごいなぁ。。。というのが実際の感想です。 ただし・・・残念なことに、ここまでの「プログラム」に なってしまうと、恐らく上司の許可が出ないと思うのです。 (お堅い&閉鎖的な職場、会社なので・・・) Dirコマンドを用いた「バッチ」に拘ったのはそのせいなのです。 あと、ファイルサーバにはExcelがインストールされていないため、 組み込み先がないんですよね(苦笑 あくまでもCSVを作成→自PCでグラフ作成、という流れになってしまいます。 めんどくさいですが、環境が・・・ねぇ。。。 ともあれ、ありがとうございました! ただ、私自身の勉強にはなりました! 最後に、このスクリプトの場合、固定ディスクの空き容量が 加算されて結果が出るので、今回の要件である、 「それぞれのドライブの空き容量調査」という意味では、 もったいないですが、ちと外れちゃいます。。。

  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.4

set /a の構文を使うと四則演算ができるのですが、符号付き32ビット整数の範囲でしか計算できないので、今回のようにディスク容量が大きいときにはオーバフローしてしまいます。 しかたがないので、今回の場合は単純に下6桁を削ってみました。 ディスクの容量が1MB以下にならないような運用で使ってください。 :---------------------------------------- sample.bat echo off for /F "tokens=3" %%s in ('dir d:\') do set size=%%s set size=%size:~0,-8% echo %date%,"%size%">>DS_D.csv

noname#67215
質問者

補足

投稿、ありがとうございます。 実験結果、非常に良好です。 で・・・ もしお時間がありましたら、 提示頂いたバッチの、各行でどのような処理を行なっているのか、 初心者にわかるように教えていただけませんでしょうか? よろしくお願いします。 ホント、皆様には感謝しています!

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

バッチじゃなくスクリプトを使ってみては? ほとんどプログラムですけど・・・

noname#67215
質問者

お礼

こんにちは。 投稿ありがとうございます。 スクリプトを書く技量がないものでして。。。orz

  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.2

こんにちは camo-techさん。 まずOSが書いていませんが 2000/XP/2003系として回答します。 CSVファイルをexcelで読み込むんですよね。 CSVファイルというのは各項目をカンマで区切るため、希望されているフォーマットでは空き容量の数値が3桁ごとに別々のセルに入ってしまいます。 よって、今回のサンプルではdirコマンドから取得した空き容量の数値のカンマはダブルクォーテーションでくくって、日付との区切りは[TAB]ではなくカンマにしています。 (もし希望されているフォーマット通りがよければ補足してください) また windows 2000 の for文では in ( ) 内での日本語使用でバグが発生するので find は使わないようにしています。(少し時間が余分にかかりますがたいした差ではないので) 出力ファイルは 2008/05/22,"39,870,087,168"[リターン] 2008/05/23,"39,870,087,168"[リターン] のようになります。 ---------------------------------------- sample.bat echo off for /F "tokens=3" %%s in ('dir d:\') do set size=%%s echo %date%,"%size%">>DS_D.csv

noname#67215
質問者

補足

すみません。 環境は2003サーバSE SP1です。 実験したところ、非常に良好な結果となりました。 グラフもばっちりです。 ただ、お頼みついでに、というわけではないのですが、 グラフにしたとき、桁数が大きすぎで、見づらいのです。 数値は「MB」単位での管理で十分ですので、 下のほうの桁を切ってファイルに吐き出すことは できませんでしょうか? 追加の「教えて!」になりますが、ご指導よろしくお願いします。

  • iriyak
  • ベストアンサー率48% (40/82)
回答No.1

こんにちは。 > 非常に簡単に容量がわかるのですが、これをグラフにするのに > 手間がかかってしまっています。 差し支えなければ、このファイルをスタート地点としてグラフ化までの作業を順番に列挙いただくことは可能ですか?? それぞれの作業が、手動か、半自動か、自動かも一緒に付け加えてください。 回答者は、その情報をもとに、ピンポイントで自動化ないし半自動化できる部分についてスクリプトの骨組みなどサジェッションできるかもしれません。

noname#67215
質問者

補足

早速の投稿、ありがとうございます。 現状では、 1.容量を吐き出すバッチを自動で実行(タスクスケジュールで自動実行) 2.吐き出されたファイルから数値をコピーしてCSVファイルにする(手動) 4.CSVファイルをExcelで読み込み(手動) 5.容量の遷移をグラフ化(手動) 今回は、2.を自動化し、CSVファイルを自動的に作らせたいのです。 (バッチをたたく、あるいは容量吐き出しバッチの後に自動実行) Excelに読み込ませたり、グラフを作るのは手動でもOKです。 よろしくお願いします。

関連するQ&A