
TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
Hey, Scripting Guy! アーカイブも忘れずにチェックしてください。
今日の質問 : 文字列値の前後にある空白をすべて削除する方法はありますか
| Q | Scripting Guy さん、よろしくお願いします。ログ ファイルにデータを書き込むカスタムの社内アプリケーションがあります。問題なのは、データの前後に大量の空白が挿入されていることがよくあります。データの前後にある空白をすべて削除する方法はありますか。 -- KS | |
| A | KS さん、こんにちは。信じがたいかもしれませんが、このコラムを書いている Scripting Guy は、ときどき、現代の世界に適応できなくなることがあります。たとえば、この世界ではだれもが携帯電話を持っています。あなたもご存知の誰かさんを除くだれもがです。この世界の誰もがハイビジョン テレビを一目見るとすぐに 5000 ドルをポーンと出して 1 台購入します。そうです、ほぼすべての人がです。この世界の誰もが、The Sporanos、Lost、または Survivor などのテレビ番組を少なくとも 1 回は見ていますね。では、次のご質問をどうぞ。こう言うとわかっていただけるかもしれません。哀れな Scripting Guy は過去に執着するあまり、野球帽を後ろ向きではなく前向きにかぶるほどなんです。 良いことを思いつきました。次回、巡業の見世物一座がレッドモンドに来たら、この Scripting Guy のことを教えてあげましょう。 言うまでもなく、この哀れな小さな男をからかうのは簡単です (GPS ナビゲーション システムを持っていない人がどうやって 1 日を切り抜けるのか不思議に思うのと同じくらいです)。でも、KS さん、今はあなたの質問のお陰で、周囲から浮いている Scripting Guy の人生にも突如として目的ができました。今から考えると、Scripting Guy のコンピュータとの出会いは、何百年も前恐竜が地球を支配し、すべての電話にコードがあった頃に遡ります。dBase III を学習する必要があり、たいへんでした (ええ、そうです。しかし、当時は人々は皆厳しかったのです)。そして、何らかの理由で、対処しなければならない dBase III アプリケーションに関するよくある問題とは、次のようなものでした。いつも結果としてデータが次のログ ファイルのようになったのです (説明のため、データの終わりをアスタリスク マークで示しています)。
Ken Myer *
Pilar Ackerman *
Gail Erickson *
重要なのは、古き良き時代において、Scripting Guy は実際に役立つ目的を果たしていたということです。文字列の先頭と末尾から余分な空白を削除することのできるコードの書き方を知っていたのです。さぁ、やっとこれで、ほんのつかの間ですが、Scripting Guy の人生がもう 1 度意味のあるものになります。次のスクリプトでは、テキスト ファイルを開いて、各行の先頭および末尾から余分な空白を削除し、変更後の行をファイルに保存します。
Const ForReading = 1
Const ForWriting = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("c:\scripts\test.txt", ForReading)
Do Until objFile.AtEndOfStream
strLine = objFile.ReadLine
strLine = Trim(strLine) & vbCrLf
strText = strText & strLine
Loop
objFile.Close
Set objFile = objFSO.OpenTextFile("c:\scripts\test.txt", ForWriting)
objFile.Write strText
objFile.Close
このスクリプトでは、まず ForReading および ForWriting という 1 組の定数を定義します。FileSystemObject (テキスト ファイルの操作に使用するスクリプト オブジェクト) が変わっているため、タスクを実行するためにログ ファイルを 2 回開く必要があります。1 回目はファイルを読み取るためで、2 回目はファイルに変更後の値を書き込むためです。これらの定数は、実行する操作の内容、つまり読み取りまたは書き込みをスクリプトに指示するだけです (それが説明した奇妙な点の 1 つです。読み取りまたは書き込み用にファイルを開くことができますが、両方を同時に実行することはできません)。 定数を定義したら、FileSystemObject のインスタンスを作成し、OpenTextFile メソッドを使用して C:\Scripts\Test.txt ファイルを読み取り用に開きます。では、次のブロックに移りましょう。
Do Until objFile.AtEndOfStream
strLine = objFile.ReadLine
strLine = Trim(strLine) & vbCrLf
strText = strText & strLine
Loop
ここでは、ReadLine メソッドを使用してファイルを 1 行ずつ読み取ります。最初に Do Until ループに入ると、テキスト ファイルの最初の行を読み取り、strLine という変数にその値を格納します。つまり、strLine は次のようになります。 Ken Myer * さぁ、ここからがお待ちかねのビンテージのプログラミング マジックです。コードの次の行では、Trim 関数を使用して文字列の前後からすべての空白を削除します (さらに、復帰/改行を追加して、テキスト ファイルの個別の行にこの値が書き込まれるようにします)。 strLine = Trim(strLine) & vbCrLf おそらくすでに推測されているとおり、Trim 関数は文字列の前後から自動的に余分な空白を削除します。つまり、strLine は次のようになります (なお、アスタリスクは実際にはありませんが、データの末尾を示すためだけに使用しています)。 Ken Myer* うまくいきましたね。次に、strLine の値を strText という変数に追加します。この変数は、トリミングするテキスト ファイルのすべての行を追跡するために使用します。 strText = strText & strLine 次に、ループして、テキスト ファイルの次の行で処理を繰り返します。このサイクルは読み取る行がなくなるまで (つまり、より専門的には、AtEndOfStream プロパティが True になるまで) 続けられます。 後は簡単です。ファイル Test.txt を閉じ、すぐに、今度は書き込み用にもう一度開きます。書き込み用にファイルを開いたら、Write メソッドを呼び出して、strText の値をファイルに書き込み、ファイルを閉じます。偶然ではありませんが、今日の仕事もこれで終わりです。ファイル Test.txt を開くと、データが整然とトリミングされています。 Ken Myer* Pilar Ackerman* Gail Erickson* 皆さんのお洒落なブラックベリーのデバイスまたはカプチーノ マシンがこれを実行するのを見てみたいです。 ちなみに、2 つの関連する役立つ関数があります。LTrim は文字列の先頭 (左側) にある余分な空白のみをトリミングします。つまり、結果のデータは次のようになります。 Ken Myer * Pilar Ackerman * Gail Erickson * 反対に、RTrim は文字列の末尾 (右側) にある余分な空白のみをトリミングします。
Ken Myer*
Pilar Ackerman*
Gail Erickson*
KS さん、これでおわかりでしょうか。なお、昔の人間なら知っていると思われるやり方 (たとえば、リモコンを使用しないでチャンネルを変える方法など) について質問がある場合も、これで、どこに尋ねればよいかわかりましたね。 |
Hey, Scripting Guy! - アーカイブもチェックしてください。