都道府県穴埋めゲーム

こんばんは

あと少しですばらしい自動化バッチが完成するところなんですが、1点だけできなくて困っているところがあります。

バッチファイルと同じディレクトリにある index.xml の一行目は次のようになっています。
C:\folder\folder\file\hoge.ttxt<?xml version="1.0"?>

すべて1行目です。同じ論理行です。
本来、<?xml version="1.0"?>で始まらなければならない xml ファイルが、いろいろな処理の都合上、冒頭にファイルパスが紛れ込んでしまっているのです。前工程の処理は私の手を出せる範囲ではなく、この状態からスタートしなければなりません。

このファイルの1行目から冒頭のファイルパスの部分を削除したいと思っています。
パスは毎回違うので、1行目すべてを「<?xml version="1.0"?>」で置き換える、という動作にすれば確実だと思います。

具体的なやり方を教えてください。
xml ファイルは大きいときで 7MB くらいあります。UTF-8で保存しています。

A 回答 (3件)

回答遅れてすみません。


ifの処理がうまくいかないとのことなので、for処理を見たら、
読み飛ばし機能がついていました。これでどうでしょうか?

cpch 65001
echo ^<?xml version="1.0"?^> >>test.txt
for /f "skip=1 delims=" %%line in ( index.xml ) do (
echo %%line >>test.txt
)

この回答への補足

http://stackoverflow.com/questions/5450921/batch …

別ファイルに出力せずとも上記のサイトの方法で

for /f "skip=1 delims=" %%l in ("%%x") do (>>tmp echo.%%l)
move /y tmp "%%x"

このようにすればいいことがわかりました。

補足日時:2012/12/04 16:15
    • good
    • 1
この回答へのお礼

ありがとうございます。

こちらの環境では「%%line」とすると動作しませんでした。
予約後か何かでしょうか。原因は不明です。試行錯誤の結果、この変数名を変えたら動きました。

cpch 65001
echo ^<?xml version="1.0"?^> >>test.txt
for /F "skip=1 delims=" %%a in ( index.xml ) do (
echo %%a >>test.txt
)

ファイルが7MBくらいあるので、この動きだとちょっと実用性に問題があるかもしれません。
ほかにもっとスマートな(ファイルの1行目だけ置き換えて保存とか)ができるか調べてみます。

お礼日時:2012/12/04 15:42

他の質問もそうだけど, 「バッチファイルだけでなんとかしよう」というのがそもそも非現実的なんだと思う.



ちなみに #2 の問題はヘルプを読めばわかる.
    • good
    • 0
この回答へのお礼

そうですね。
でもこれができれば、当面はすべてが自動化されて手間はかからなくなります。
圧縮や解凍についてはソフトをインストールしてコマンドから使うようにしていますよ。

今更ながら、VBSでやればよかったのか、とも思いますけどね。

お礼日時:2012/12/04 17:36

作成するファイル名は、お任せします。



chcp 65001
set 変数 ""
for /F を使って入力を1行ずつ読み込む(
if 変数が空文字だったら
  echo <?xml version="1.0"?> >>出力ファイル
set 変数 "処理済み"
else
  echo 一行分のデータ >>出力ファイル



というか、こんな仕様で処理をするとあなたがバグを仕様化しているので、
後々、問題になりますよ。

この回答への補足

@echo off
setlocal enabledelayedexpansion
set skip=""
for /F "delims=" %%a IN (index.xml) DO (
if !skip!=="" (
echo ^<^?xml version="1.0"?^> >> test.txt
set skip="skip"
) else (
echo %%a >> test.txt
)
)

調べてここまでできたんですが、else の処理がされていないみたいです。おそらくエスケープしなきゃいけないんですかね。
あきらめます。

補足日時:2012/12/04 10:59
    • good
    • 0
この回答へのお礼

ありがとうございます。
説明が気になっているところを書き直してみたんですが、なかなか動作しません。

for /F を使って入力を1行ずつ読み込む(
これは

for /F "delims=" %%a in (D:\Folder\index.xml) do (
これでよいのでしょうか?

また
echo <?xml version="1.0"?> >>出力ファイル
これは、一番最初のループなので・・・出力ファイルは新たに作成する、ということでしょうか?

set 変数 "処理済み" は理解しました。
これで、2回目以降のループで、先ほどの出力ファイルにどんどん追加していく、ということですよね?


7MBくらいのファイルの先頭行を定型的に置き換えるだけなんですが、のこりすべてを別のファイルとして書き出すしか手はないのでしょうか?ほかにスマートにできる方法がありましたら教えてください。
原因はまだ不明ですが、いただいたコードをうまく書き換えて実行可能なものにできませんでした。


たとえば
指定のファイルを開いて1行目だけを <?xml version="1.0"?> にして保存して閉じる、とか
bat ファイルというのはそういう操作が簡単にできるのかと思っていましたが、どうもコードを見てもなかなかピンとくるものがなく・・・

お礼日時:2012/12/04 08:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報