入門講義9:ファイルの内容を変換する

BASH,bat,バッチ

入門講義9ではファイルの内容を置き換える方法を解説します。ただし、いきなり置き換えると、多くのステップを踏む異なりとても大変です。

このため、1つ1つステップを踏んで解説します。

まず、部分的に削除する方法を解説し、次に部分的に内容を置き換える方法を解説します。

この内容を学ぶことで、ファイルの内容を目で見て置き換えずに、バッチファイルによって一気に文字の置換が行えるので、作業の効率化になります。

それでは、実際にやってみましょう。

ファイルの内容を部分的に削除する方法

ファイルの内容を部分的に削除するには、forコマンドとdelimsオプション、tokensオプションを使用します。

単純にファイルの内容を表示したり、文字を追記したりるときは、typeコマンドでもいいのですが、部分的に削除するにはforコマンドを使用します。

単純に追記したり、表示したりする方法を知りたい方は入門講義3を参照してください。

それでは下記の例文を使って部分的に文字を削除します。

私は太郎です。
毎月、暮らしに役立つ情報を発信しているものです。
I am taro.I am from kyoto, but I live in niigata.

とりあえず、「.」と「,」を削除するコードを実行します。

@echo off
for /f "tokens=1-7 delims=.," %%a in (ex.txt) do (echo %%a %%c %%e)

コマンドスクリプトの結果はこちら。

下記のとおりex.txtの内容とバッチファイルの内容が削除されました。

ex.txtex2.bat違い
私は太郎です。毎月、暮らしに役立つ情報を発信しているものです。I am taro.I am from kyoto, but I live in niigata.私は太郎です。毎月、暮らしに役立つ情報を発信しているものです。I am taroI am from kyoto., but I live in niigata.

下記のとおり、分解して解説します。

  • for /f
  • tokens
  • delims
  • %%a in(ex.txt)
  • do (echo %%a %%c %%e)

このコードのポイントは「tokens」と「delims」です。

tokensで非表示の内容を表示させる機能があり、delimsは文字を削除します。

for /f

for /fは繰り返し作業を1列行う内容です。forコマンドの詳しい解説はこちらから参照してみてください。オプション/fを使うことで、繰り返し作業の機能であるforコマンドが少し機能を変えています。

tokens

次にtokensオプションは「tokens=」の後に取り出したい文字列の番号を記入します。ここではすべて記入したいため「tokens=1-7」と書きました。もし、1番目と3番目の文字が欲しい場合は「tokens=1,3」と記載します。

「tokens」オプションをつけると、「%%b」、「%%c」…の変数に代入されます。for文では「%%a」を指定しているので、アルファベット順の「%%b」、「%%c」が自動的に使用されます。「%%a」ではなく「%%i」を指定した場合だと、2単語以下には「%%j」、「%%k」…が使われます。

3行目の「I am taro.I am from kyoto, but I live in niigata.」はもともと空白が9つあります。delimsオプションによって「.」と「,」が削除されて、空白になるので、空白11つになります。

これによって、「but」の前で空白7つです。

よって、今回のコードは7つまでしかtokensオプションで設定されていませんので、but以降は表示されなかったのです。

delims

delimsオプションは文字を削除する機能があります。今回のコードの場合、「,」と「.」がの文字が削除されます。

空白を削除したい場合は「 」と記載し、スペースを入れると空白がなくなります。

%%a in(ex.txt)

変数aをテキストファイルのexの内容を入れるという意味です。doの後のコマンド処理によって、変数aは使われます。

do (echo %%a %%c %%e)

doはforコマンドとセットですので、特に解説ありません。強いて言えば、doは和訳すると「〜をする」ですので、()の内容を処理すると訳せますね。

echoの後にそれぞれの変数が表示されます。

tokensオプションによって、1から7までの変数が設定されました。1から7までの変数を設定しますので、aが1、bが2、cが3、dが4…という順番で変数にex.txt.データの内容が表示します。

コード解説まとめ1

以上、コードを分解して解説しました。

このコードのポイントは「delims」オプションで文字を削除します。

今回のコードでは、「.」と「,」です。

文字を削除すると、半角の空白「 」が生じます。

forコマンドを使って表示すると、半角の空白以降は表示されません。

空白以降を表示させたい場合、tokensオプションを使います。

「tokens=1-7」を記載することで、空白以降も表示されます。しかし、空白が7つまで鹿表示されないので8つ目以降は表示されません。

そのほかこれまで習ってきた繰り返し処理の内容ですので組み合わせで処理が可能になりました。

ファイルの内容を編集する方法

最後にテキストファイルの編集方法について解説します。テキストファイルを編集する方法は少し複雑です。

説明する前に実践してみます。下記のコードを用意して、前節で使用したex.txtのテキストファイルを編集します。

@echo off
if exist ex3.txt del ex3.txt
setlocal ENABLEDELAYEDEXPANSION
for /f "delims=" %%a in (ex.txt) do (
 set hensu=%%a
 echo !hensu:taro=hanako! >> ex3.txt)
endlocal

このバッチを使用した結果はこちら。新たにex3.txtファイルが作成され、赤線の部分が変更されました。「I am taro」が「I am hanako」に内容が書き換わりました。

各行の解説をします。このコードのポイントは !hensu:taro=hanako!です。

@echo off

@はコマンド処理を表示しないという意味です。

echo offはコマンドの処理を表示しないと意味。

@+echo offで以下のコマンド処理を表示しないという意味になります。

詳しくは別記事で解説してますので、こちらの記事を参照ください。

if exist ex3.txt del ex3.txt

このコードの意味は、「もし、ex3.txtファイルがあれば、ex3.txtを削除する」です。

これからex3.txtファイルを作成しますので、ex3.txtがあると、エラーを引き起こします。

エラー防止のために、ex3.txtファイルの存在を確認し、ex3.txtがあれば削除する命令をしています。

setlocal ENABLEDELAYEDEXPANSION endlocal

setlocalとendlocalはローカル変数を設定する機能です。ローカル変数とは、setlocalからendlocalまでの間で設定される変数のことです。この外に設定された変数は無関係となります。

詳しくはこちらの記事で解説しています。

enabledelayedexpansionは遅延環境変数を設定するときに使います。詳しくは別記事で紹介しますが、今回はこのオプションをつけないとダメなんだと思ってください。

for /f “delims=” %%a in (ex.txt) do (

これは前節でも解説しましたが、forコマンドで繰り返し処理を行います。delimsオプションは削除する文字を指定します。

変数aにテキストファイルのex.txtファイルの内容を入れた後にdoの()内のコマンドを処理します。

set hensu=%%a

setコマンドは変数を設定するコマンドです。

hensuという名前の変数に変数aをいれます。

変数aは先ほどのforコマンドの時に設定しましたね。変数aにはex.txtファイルの内容が含まれてます。

要するに、hensu=%%a=ex.txtとなり、hensuにはex.txtファイルの内容が入ることになります。

echo !hensu:taro=hanako! >> ex3.txt)

ここで今回のコマンド処理の最大のポイントです。やっと最後にやってきました。

最大のポイントは!!に囲まれた内容です。hensuの内容のtaroをhanakoに変更するという意味です。

変数:[変数の中にある変えたい文字]=[変えた後の文字]

この変数の文字を変えた後のファイルを最終的に出力する方法が「>>」です。

「>>」の使い方は以下のとおりです。

[コマンド処理]>>[ファイル名]

>,>>の使い方はこちらの記事を参照してください。

コード解説まとめ2

今回のコードは新たに2つのことを解説します。

  • 遅延環境変数
  •  !hensu:taro=hanako! >> ex3.txt

この2つはそれぞれ解説しました。

今回のコードを順番に解説すると

  1. 出力する同じファイル名があったら削除する
  2. 遅延環境変数の設定
  3. 編集するファイルを読み込む
  4. 変換する文字の指定と変換後の文字の設定

このように文字を変換するのに、大変な労力がかかりました。wordのソフトだと置換機能で一発で変換できますが、バッチファイルだとすごく手間がかかります。

このバッチファイルを作れば、複数のテキストファイルを編集することができることがメリットかなと思います。

まとめ

入門講義9では、ファイルの内容を編集する方法を解説しました。ファイルの内容を編集するにあたり、部分的に文字を削除する方法、次に編集する方法を解説しました。

ファイルの内容を削除、編集するには、5つのことを理解すれば、行えます。

  • forコマンドの繰り返し処理
  • tokensオプションの使い方
  • delimsオプションの使い方
  • 遅延環境変数の使い方(setlocal ・・・)
  • 「!変数名:変換する文字=変換後の文字!>>ファイル名」の使い方

1つ1つはじっくり理解すれば、さほど難しい内容ではありませんが、組み合わせると少し複雑になって難しいかもしれません。

今回の講義では足りない部分は関係するページのリンクもありますので、合わせて読んで理解を深めてもらえたらと思います。

コメント

タイトルとURLをコピーしました