【100~200pt】テキストファイルの1行目だけを特定の文字列に一瞬で置き換える方法(ファイルは開かない)


こんばんは
Windows 7/8 64bit を使っています。
毎日仕事で処理するファイルに、ある単純作業があり、面倒で困っています。

2行からなるXMLファイルです。
1行目が「不要な文字列不要な文字列<?xml version="1.0"?>」となっています。
2行目は、延々とXMLファイルの内容が続きます。途中に改行はありません。

このままだと後工程で処理ができないため、1行目を「<?xml version="1.0"?>」に変えなければなりません。「不要な文字列」の部分は毎回異なりますが、だいたい100文字くらいです。2行目のXML本体ですが、大きいときには6MBくらいあるときがあります。

いつもはファイルを開いて一行目の「不要な文字列」を手動で削除していますが面倒です。たとえば、テキストファイルを右クリックして表示されるコンテキストメニューから「不要な文字列削除」を選ぶだけ、とかがいいです。batファイルなどを作ってドラッグ&ドロップするのすら面倒です。右クリック&ショートカットの動作でこの処理ができないでしょうか?

質問などはコメント欄で受け付けています。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/09/04 09:02:32
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:usamin5885 No.3

回答回数18ベストアンサー獲得回数8

ポイント150pt

PowerShellのワンライナーでできますが、
改行コードがCRLFになっちゃうんですよね。
LFじゃないとダメですか?

"C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe" "mv \"%1\" \"%1.old\";'<?xml version=\"1.0\"?>'|Out-File \"%1\";gc \"%1.old\"|select -skip 1|Out-File -Append \"%1\""

これをコンテキストメニューのcommandとして登録すれば良いです。
分かりづらいと思うので、元のコードも載せておきます。

$FILE = "c:\hoge.xml"
mv "$FILE" "$FILE.old"
'<?xml version="1.0"?>' | Out-File "$FILE"
gc "$FILE.old" | select -skip 1 | Out-File -Append "$FILE"

id:Nigitama

できたっぽいです!ちょっと時間がなくて最終確認が取れませんが、これでいけそうです!

2013/09/03 22:08:55
id:Nigitama

最終確認取れました。ここからさらにバッチファイルを呼び出すこともできました。最高です!

2013/09/07 15:52:23

その他の回答2件)

id:dawakaki No.1

回答回数797ベストアンサー獲得回数122

バッチファイルでテキストファイルの1行目だけ変更
http://oshiete.goo.ne.jp/qa/7828732.html

id:TransFreeBSD No.2

回答回数668ベストアンサー獲得回数268

ポイント50pt

登録はうぃんどさんの方法でするとして
#wshの方法もあった気がしたけど見つけられない

登録するバッチファイルはこんなのでどうでしょう?

move %1 %1.old
echo "<?xml version="1.0"?>" >> %1
more +1 %1.old >> %1

http://q.hatena.ne.jp/1282045430#a1032760

id:Nigitama

ありがとうございます。

できたような気がしたんですが、対象のファイルがUTF-16で、これが原因でできないっぽいです。batファイル自体はShift-JISにしておかないと動作しないみたいなのでShift-JISにするとして、新たに出力されるファイルがSHIFT-JISになってしまっています。

出力するときに文字コードを指定できるか調べたのですが、みつかりませんでした。UTF-16のファイルを扱って、出力もUTF-16にする場合はどうしたらよいでしょうか?

2013/08/31 01:28:21
id:TransFreeBSD

うぐ、そんな落とし穴が。
知りませんでした。勉強になります。
たぶんDOS環境のエミュレーションとかで勝手に変換されるんでしょう。
回避策分かりません。バッチファイルじゃ無理かも。

2013/08/31 11:02:23
id:usamin5885 No.3

回答回数18ベストアンサー獲得回数8ここでベストアンサー

ポイント150pt

PowerShellのワンライナーでできますが、
改行コードがCRLFになっちゃうんですよね。
LFじゃないとダメですか?

"C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe" "mv \"%1\" \"%1.old\";'<?xml version=\"1.0\"?>'|Out-File \"%1\";gc \"%1.old\"|select -skip 1|Out-File -Append \"%1\""

これをコンテキストメニューのcommandとして登録すれば良いです。
分かりづらいと思うので、元のコードも載せておきます。

$FILE = "c:\hoge.xml"
mv "$FILE" "$FILE.old"
'<?xml version="1.0"?>' | Out-File "$FILE"
gc "$FILE.old" | select -skip 1 | Out-File -Append "$FILE"

id:Nigitama

できたっぽいです!ちょっと時間がなくて最終確認が取れませんが、これでいけそうです!

2013/09/03 22:08:55
id:Nigitama

最終確認取れました。ここからさらにバッチファイルを呼び出すこともできました。最高です!

2013/09/07 15:52:23
  • id:cubick
    1行目の「不要な文字列」は取り出す必要が無いわけですから、簡単に処理すると

    ・1行目を削除
    ・代わりに<xml~>の行を挿入
    ・2行目以降はそのまま出力

    で済みそうな気がします。
  • id:taknt
    秀丸とかで Grepで一括置換とかは どう?

    ま、専用のアプリを作ればいいだけかと思うけどね。
  • id:mkonomi
    (ファイルは開かない) で処理する方法って存在するのでしょうか?

    削除、挿入、置換などの処理はテキストエディターで開いてからの処理だと思いますが・・・.

  • id:standard_one
    >テキストファイルを右クリックして表示されるコンテキストメニューから「不要な文字列削除」を選ぶだけ、とかがいいです
    XAMPP入れてバッチ作ってコンテキストメニューに登録すればできますけどね。
    その環境を構築するまでが大変ですよ。
  • id:Beirii
    バッチファイル作って、右クリックで起動できるフリーのランチャーソフトに登録するとか。
  • id:windofjuly
    うぃんど 2013/08/30 14:54:25
    (a)コンテキストメニュー登録なら…。
    http://www.itmedia.co.jp/help/tips/windows/w0444.html
    Windows8はレジストリいじらないといけないって…
    やっぱり面倒になっただけ…8.1に期待していいのかなぁ…
    http://www.atmarkit.co.jp/ait/articles/1307/05/news055.html

    (b)運用の問題なら…。
    そのファイルをパソコンに入れるタイミングや、作成されるタイミング、
    使用するタイミングってのがあると思うのですが…。

    それらのタイミングで更新用スクリプトを起動できないかを検討したり、
    タスクスケジューラで対応できないかを検討したりってことが必要なのでは?

    そのデータを利用するアプリを直接起動せず、
    更新用スクリプトを起動してからアプリを起動するような形は?
    (アプリ起動前処理が重すぎるので無しになるでしょうけど一応…。)
  • id:Nigitama
    みなさんいろいろとコメントありがとうございます。

    現状は、ファイルを開いて目視確認して削除していますが、たぶん年間で300回くらいはこの作業をします。ここ数年続けているのでひょっとしたら1000回くらいやったかもしれません。

    id:Beiriiさん
    > バッチファイル作って、右クリックで起動できるフリーのランチャーソフトに登録するとか
    こういうことができればうれしいです。

    id:standard_oneさん
    > XAMPP入れてバッチ作ってコンテキストメニューに登録すればできますけどね。
    WAMP環境なら入っていてローカル限定ですが毎日使っています。

    このスクリプトは手動で実行できれば十分で、スケジュールとかトリガとかは考えなくていい質の仕事です。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません