Hey, Scripting Guy!

Hey, Scripting Guy!

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! - アーカイブもチェックしてください。

ページのトップへページのトップへ