- ベストアンサー
テキストファイルから最終行の抽出
テキストファイルに出力された内容のうち、 最終行のみ抽出し、他のテキストファイルに 落とし込みたいと考えています。 DOSコマンドを使用して実現したいと思うのですが 良い方法などございましたら、ご教授ください。 宜しくお願い致します。 ※OSはWindows Server 2003を使用しています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
98SEから2003までのすべてのWindowsに標準搭載されているコマンドでFORと>(リダイレクト)を使って出来ます。 FOR /F "TOKENS=1*" %A IN ([元ネタファイル名]) DO ECHO %A > [出力先ファイル名] (大カッコ([ ])は必要ありませんが、普通のカッコ( () ) は必要です。) 元ネタのファイルサイズが大きかったら少々思い処理になるかもしれませんが、所詮テキストファイルですので、極端に時間がかかるものでもないでしょう。 なお、元ネタのファイルはSVS形式などのファイルだと思いますが、そうだとするとフィールドの区切り文字をそのデータ内に含まれないものにするといいですね。FORのなかに" "で囲まれた部分がありますが、そこに 「delims=...」などとデータ内に無い文字列を指定します。"TOKENS=1* delims=..."というようにTOKENSとはスペース区切りで追加します。 (今回、元ネタのデータがどういうものか分からないのではっきりとした答えを書きようがありません。データの形式によっては例外処理対応をする必要もあります。 バッチで組むならもっと軽くする方法はありますね。なお、その際、FORの内部変数を%%Aとする必要がありますので気をつけましょう。今回はコマンドラインでということですので、コマンドライン1行で出来るものとしています。
その他の回答 (3)
すみません。訂正をいくつか。 SVS→CSV コマンドラインでと→コマンドで でしたね。これがコマンドラインからなのかバッチスクリプトで処理していいのか判断が出てきますね。 私が、先の回答であげていたのは、その元ネタファイルを1行ずつファイルに上書きでリダイレクトすれば最後の行を書き込んだ時点で最後の行が残るということになります。 WindowsのコマンドではUNIXと違い、テキスト処理ができるものがあまり揃ってないのでしばしばこう言う裏技的な処理が必要になってきますね。まさにパズル状態です。 もし、その時々の処理の「最後の行」をログファイルのように管理したいのでしたら、この後にそのファイルから別のファイルに>>で追記リダイレクトするといいでしょう。 また、ファイルに1行1行書き込むよりも変数に上書きで叩き込み、最後にその変数をファイルに書き出すと処理は幾分早いでしょうね。 やり方はいろいろあると思います。もっと良い解もあると思いますので、研究されてはいかがでしょうか?
DOSコマンドでそれを実現する機能は標準では付いてないようです。 unix系ではtailというプログラムがあって、それをdosに移植したものがありますので、使ってみてください。 参考URLにあるものをWinXP Proで使ってみましたが、できました。 リダイレクトについては大丈夫ですか? 念のために表示結果をファイルに書きたいときは >tail.exe inputfile > outputfil というように、コマンドの後に > と 出力先のファイル名を指定すれば、できます。 追記したいなら > ではなく >> で、後ろに追加されます。
お礼
crum様: 有難うございます。 早速試してみます。 >unix系ではtailというプログラムがあって、それをdosに移植したものがありますので、使ってみてください。 こういうソフトがあるんですね(^^" また結果報告をさせて頂きます。
- mendokusa
- ベストアンサー率13% (359/2726)
unix系だとtailと言うコマンドがあります。MD-DOS用は探してみて下さい。
お礼
mendokusa様: 上にご紹介頂きましたソフトで一度検証してみます。 有難うございますm(_ _)m
お礼
lar様: 補足まで頂きまして有難うございます。 for文により最終行の抽出できました! この構文で最終行のみ抜き出せる理由が まだ理解できていませんが、勉強させて頂きます。 御世話をお掛け致しました。