TRIMトリム関数

本ページには広告が含まれています。

文字列の両端の空白と制御文字を取り除きます。

構文
  1. UString = TRIM( 文字列, 全角空白 )
引数
文字列 (String)必須
文字列
全角空白 (Boolean = False)省略可
FALSE
全角の空白は含めない(デフォルト)
TRUE
全角の空白を含めて削除
戻り値
両端の空白と制御文字が取り除かれた文字列

制御文字

コンピューターで文字データを扱うとき改行などを制御する特別な文字で、画面や印刷には表示されません。

以下の表は制御文字の一覧で、TRIM関数では0x7FDEL以外の制御文字を取り除くことができます。

コード キャレット記法 略号 名称
10進数 16進数
0 0x00 ^@ NUL 空文字
Null
1 0x01 ^A SOH ヘッダー開始
Start of Heading
2 0x02 ^B STX テキスト開始
Start of Text
3 0x03 ^C ETX テキスト終了
End of Text
4 0x04 ^D EOT 転送終了
End of Transmission
5 0x05 ^E ENQ 照会
Enquiry
6 0x06 ^F ACK 受信OK
Acknowledge
7 0x07 ^G BEL 警告(ベル)
Bell
8 0x08 ^H BS 後退
Backspace
9 0x09 ^I HT タブ
Horizontal Tabulation
10 0x0A ^J LF 改行
Line Feed
11 0x0B ^K VT 垂直タブ
Vertical Tabulation
12 0x0C ^L FF 改ページ
Form Feed
13 0x0D ^M CR 復帰
Carriage Return
14 0x0E ^N SO シフトアウト
Shift Out
15 0x0F ^O SI シフトイン
Shift In
16 0x10 ^P DLE データリンクエスケープ
Data Link Escape
17 0x11 ^Q DC1 装置制御1
Device Control 1
18 0x12 ^R DC2 装置制御2
Device Control 2
19 0x13 ^S DC3 装置制御3
Device Control 3
20 0x14 ^T DC4 装置制御4
Device Control 4
21 0x15 ^U NAK 受信失敗
Negative Acknowledge
22 0x16 ^V SYN 同期
Synchronous Idle
23 0x17 ^W ETB 転送ブロック終了
End of Transmission Block
24 0x18 ^X CAN キャンセル
Cancel
25 0x19 ^Y EM メディア終了
End of Medium
26 0x1A ^Z SUB 置換
Substitute Character
27 0x1B ^[ ESC エスケープ
Escape
28 0x1C ^\ FS フォーム区切
File Separator
29 0x1D ^] GS グループ区切
Group Separator
30 0x1E ^^ RS レコード区切
Record Separator
31 0x1F ^_ US ユニット区切
Unit Separator
127 0x7F ^? DEL 削除
Delete

タブ(0x09)と改行(0x0D0x0A)はUWSCで特殊文字として用意されているので、それぞれ<#TAB><#CR>で書き換えることができます。

制御文字は直接文字として入力することはできませんが、CHR関数に10進数の値を指定することで制御文字に一致させることができます。

使い方

両端の制御文字を取り除く

stringの両端のタブ(制御文字)を取り除きます。

UWSC
DIM string = "<#TAB>タブ<#TAB>"
PRINT TRIM(string)
結果
プレーンテキスト
タブ

制御文字が連続している場合は、連続するすべての制御文字が取り除かれます。

UWSC
DIM string = "<#TAB><#TAB><#TAB>タブ<#TAB>"
PRINT TRIM(string)
結果
プレーンテキスト
タブ

種類の違う制御文字が連続している場合でも、すべて取り除かれます。

UWSC
DIM string = "<#TAB><#CR>制御文字<#TAB><#TAB>"
PRINT TRIM(string)
結果
プレーンテキスト
制御文字

取り除かれるのは先頭もしくは末尾から連続する制御文字のため、文中の制御文字を取り除くことはできません。以下の場合両端の<#TAB>は削除されますが、文中の<#CR>は削除されません。

UWSC
DIM string = "<#TAB>制御<#CR>文字<#TAB>"
PRINT TRIM(string)
結果
プレーンテキスト
制御
文字

一部の制御文字のみ取り除く

CHR関数POS関数を組み合わせて制御文字の位置を取得することで、一部の制御文字のみを取り除くことができます。

以下は0x09であるタブの位置を取得するプログラムです。stringの中でタブが最初に見つかった位置が1文字目なので1が返ります。

UWSC
DIM string = "<#TAB>タブ"
PRINT POS(CHR(9), string)
結果
プレーンテキスト
1

stringから連続する左側のタブのみ取り除くには以下のように記述します。1文字目がタブならstringに2文字目以降を代入を繰り返すことで左側のタブを取り除いています。

UWSC
DIM string = "<#TAB><#TAB>タブ"

WHILE POS(CHR(9), string) = 1
	string = COPY(string, 2)
WEND

PRINT string
結果
プレーンテキスト
タブ

右側のタブを取り除くにはPOS関数の第三引数に-1を指定し、後ろからサーチします。左側のタブはそのまま残ります。[HT]がタブを表しています。

UWSC
DIM string = "<#TAB><#TAB>タブ<#TAB><#TAB>"

WHILE POS(CHR(9), string, -1) = LENGTH(string)
	string = COPY(string, 1, LENGTH(string) - 1)
WEND

PRINT string
結果
プレーンテキスト
[HT][HT]タブ

文中の制御文字を取り除く

両端だけでなく文字列全体から特定の制御文字を取り除きたい場合は、CHR関数REPLACE関数の組み合わせで置換することができます。以下はstringからCRLFの続く制御文字を取り除きます。CRLFはWindowsでよく使われる改行を意味する制御文字です。

UWSC
DIM string = "改行<#CR>改行"
PRINT REPLACE(string, CHR(13) + CHR(10), "")
結果
プレーンテキスト
改行改行

CRだけ取り除く場合は、以下のように記述します。

UWSC
DIM string = "改行<#CR>改行"
PRINT REPLACE(string, CHR(13), "")
結果
プレーンテキスト
改行[LF]改行

LFだけ取り除く場合は、以下のように記述します。

UWSC
DIM string = "改行<#CR>改行"
PRINT REPLACE(string, CHR(10), "")
結果
プレーンテキスト
改行[CR]改行

全角スペース

第二引数にTrueを指定すると両端の全角スペースを取り除くことができます。

UWSC
DIM string = " 全角スペース "
PRINT TRIM(string)
PRINT TRIM(string, TRUE)
結果
プレーンテキスト
 全角スペース 
全角スペース

制御文字

以下のプログラムはTRIM関数で制御文字を取り除くプログラムです。UWSC Debuggerでは制御文字の入力ができないため、サクラエディタで編集して実行しています。

実行時は制御文字を直接入力してテストしていますが、制御文字は通常見えなく区別もつかないため可視化しています。[ ]で囲まれたアルファベットが制御文字を表しています。以下のプログラムは制御文字を直接入力しているわけではないため、実行しても制御文字は取り除くことはできません。

TRIM関数を実行する前の文字数と実行した後の文字数を比較し、変化があれば制御文字を取り除けたと判定しTrueを、取り除けなければFalseと出力しています。

以下の結果からわかるように0x000x1Fの範囲の制御文字はTRIM関数で取り除くことができますが、0x7F削除(DEL)のみは取り除くことができません。

UWSC
DIM array[] = "[SOH]ヘッダー開始[SOH]", "[STX]テキスト開始[STX]", "[ETX]テキスト終了[ETX]", "[EOT]転送終了[EOT]", "[ENQ]照会[ENQ]", _
				"[ACK]受信OK[ACK]", "[BEL]警告(ベル)[BEL]", "[BS]後退[BS]", "[HT]タブ[HT]", "[LF]改行[LF]", _
				"[VT]垂直タブ[VT]", "[FF]改ページ[FF]", "[CR]復帰[CR]", "[SO]シフトアウト[SO]", "[SI]シフトイン[SI]", _
				"[DLE]データリンクエスケープ[DLE]", "[DC1]装置制御1[DC1]", "[DC2]装置制御2[DC2]", "[DC3]装置制御3[DC3]", "[DC4]装置制御4[DC4]", _
				"[NAK]受信失敗[NAK]", "[SYN]同期[SYN]", "[ETB]転送ブロック終了[ETB]", "[CAN]キャンセル[CAN]", "[EM]メディア終了[EM]", _
				"[SUB]置換[SUB]", "[ESC]エスケープ[ESC]", "[FS]フォーム区切[FS]", "[GS]グループ区切[GS]", "[RS]レコード区切[RS]", _
				"[US]ユニット区切[US]", "[DEL]削除[DEL]"

PRINT "トリム前,トリム後,トリム有無"

FOR string IN array
	PRINT string + "," + TRIM(string) + "," + IIF(LENGTH(string) - LENGTH(TRIM(string)), TRUE, FALSE)
NEXT
結果
CSV
トリム前,                           トリム後,                 トリム有無
[SOH]ヘッダー開始[SOH],             ヘッダー開始,             True
[STX]テキスト開始[STX],             テキスト開始,             True
[ETX]テキスト終了[ETX],             テキスト終了,             True
[EOT]転送終了[EOT],                 転送終了,                 True
[ENQ]照会[ENQ],                     照会,                     True
[ACK]受信OK[ACK],                   受信OK,                   True
[BEL]警告(ベル)[BEL],               警告(ベル),               True
[BS]後退[BS],                       後退,                     True
[HT]タブ[HT],                       タブ,                     True
[LF]改行[LF],                       改行,                     True
[VT]垂直タブ[VT],                   垂直タブ,                 True
[FF]改ページ[FF],                   改ページ,                 True
[CR]復帰[CR],                       復帰,                     True
[SO]シフトアウト[SO],               シフトアウト,             True
[SI]シフトイン[SI],                 シフトイン,               True
[DLE]データリンクエスケープ[DLE],   データリンクエスケープ,   True
[DC1]装置制御1[DC1],                装置制御1,                True
[DC2]装置制御2[DC2],                装置制御2,                True
[DC3]装置制御3[DC3],                装置制御3,                True
[DC4]装置制御4[DC4],                装置制御4,                True
[NAK]受信失敗[NAK],                 受信失敗,                 True
[SYN]同期[SYN],                     同期,                     True
[ETB]転送ブロック終了[ETB],         転送ブロック終了,         True
[CAN]キャンセル[CAN],               キャンセル,               True
[EM]メディア終了[EM],               メディア終了,             True
[SUB]置換[SUB],                     置換,                     True
[ESC]エスケープ[ESC],               エスケープ,               True
[FS]フォーム区切[FS],               フォーム区切,             True
[GS]グループ区切[GS],               グループ区切,             True
[RS]レコード区切[RS],               レコード区切,             True
[US]ユニット区切[US],               ユニット区切,             True
[DEL]削除[DEL],                     [DEL]削除[DEL],           False

プログラム実行例

システムの起動時間を取得

システムの起動時間をyyyy年m月d日 h:n:sの形式で取得します。

UWSC
PRINT TRIM(POWERSHELL("[Management.ManagementDateTimeConverter]::ToDateTime((Get-WmiObject Win32_OperatingSystem).LastBootUpTime)"))
結果
プレーンテキスト
2019年12月21日 15:53:56
使用関数

ファイルを開いているプロセスを調べる

UWSC
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")

CONST TemporaryFolder = 2

DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")

WITH FSO
	DIM Folder = .GetSpecialFolder(TemporaryFolder)
	DIM folderspec = Folder.Path
	DIM filename = .GetTempName
	DIM path = .BuildPath(folderspec, filename)
ENDWITH

DIM Shell = CREATEOLEOBJ("Shell.Application")
Shell.FileRun()

DIM ID = GETID("ファイル名を指定して実行", "#32770")

SENDSTR(ID, "cmd /c openfiles /query /fo CSV > " + path)
CLKITEM(ID, "OK", CLK_BTN)
SLEEP(0.500)

REPEAT
	SLEEP(0.100)
UNTIL GETID("C:\WINDOWS\system32\cmd.exe", "ConsoleWindowClass") = -1

DIM FID = FOPEN(path, F_READ)

TRY
	DIM ID2 = GETID("使用中", "OperationStatusWindow")

	GETITEM(ID2, ITM_ACCTXT, 1)
	DIM str = ALL_ITEM_LIST[1]
	
	DIM sep = IIF(POS("フォルダー", STATUS(ID2, ST_TITLE)) <> 0, "\", "")
	DIM msg = "■" + str + "<#CR>"
	
	FOR r = 5 TO FGET(FID, F_LINECOUNT)
		IF POS("\" + str + sep,  FGET(FID, r, 3)) <> 0 THEN
			msg = msg + "ID:" + FGET(FID, r, 1) + ", プロセス名:" + FGET(FID, r, 2) + "<#CR>"
		ENDIF
	NEXT
	FCLOSE(FID)

	REPEAT
		FUKIDASI(TRIM(msg))
		SLEEP(0.100)
	UNTIL GETID("使用中", "OperationStatusWindow") = -1
FINALLY
	FSO.DeleteFile(path)
ENDTRY

//////////////////////////////////////////////////
// 【引数】
//   
// 【戻り値】
//   
//////////////////////////////////////////////////
PROCEDURE forceQuit()
	EXITEXIT
FEND

//////////////////////////////////////////////////
// 【引数】
//   expr : 評価する式 
//   truepart : 評価した式がTrueのときに返す値 
//   falsepart : 評価した式がFalseのときに返す値 
// 【戻り値】
//   truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき 
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
	IFB EVAL(expr) THEN
		RESULT = truepart
	ELSE
		RESULT = falsepart
	ENDIF
FEND
使用関数
解説