目次
文字列の両端の空白と制御文字を取り除きます。
- 構文
- UString = TRIM( 文字列, 全角空白 )
- 引数
- 文字列 (String)必須
- 文字列
- 全角空白 (Boolean = False)省略可
- FALSE
- 全角の空白は含めない(デフォルト)
- TRUE
- 全角の空白を含めて削除
- 戻り値
- 両端の空白と制御文字が取り除かれた文字列
制御文字
コンピューターで文字データを扱うとき改行などを制御する特別な文字で、画面や印刷には表示されません。
以下の表は制御文字の一覧で、TRIM関数では0x7FのDEL以外の制御文字を取り除くことができます。
コード | キャレット |
略号 | 名称 | |
---|---|---|---|---|
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の両端のタブ(制御文字)を取り除きます。
DIM string = "<#TAB>タブ<#TAB>"
PRINT TRIM(string)
- 結果
タブ
制御文字が連続している場合は、連続するすべての制御文字が取り除かれます。
DIM string = "<#TAB><#TAB><#TAB>タブ<#TAB>"
PRINT TRIM(string)
- 結果
タブ
種類の違う制御文字が連続している場合でも、すべて取り除かれます。
DIM string = "<#TAB><#CR>制御文字<#TAB><#TAB>"
PRINT TRIM(string)
- 結果
制御文字
取り除かれるのは先頭もしくは末尾から連続する制御文字のため、文中の制御文字を取り除くことはできません。以下の場合両端の<#TAB>は削除されますが、文中の<#CR>は削除されません。
DIM string = "<#TAB>制御<#CR>文字<#TAB>"
PRINT TRIM(string)
- 結果
制御 文字
一部の制御文字のみ取り除く
CHR関数とPOS関数を組み合わせて制御文字の位置を取得することで、一部の制御文字のみを取り除くことができます。
以下は0x09であるタブの位置を取得するプログラムです。stringの中でタブが最初に見つかった位置が1文字目なので1が返ります。
DIM string = "<#TAB>タブ"
PRINT POS(CHR(9), string)
- 結果
1
stringから連続する左側のタブのみ取り除くには以下のように記述します。1文字目がタブならstringに2文字目以降を代入を繰り返すことで左側のタブを取り除いています。
DIM string = "<#TAB><#TAB>タブ"
WHILE POS(CHR(9), string) = 1
string = COPY(string, 2)
WEND
PRINT string
- 結果
タブ
右側のタブを取り除くにはPOS関数の第三引数に-1を指定し、後ろからサーチします。左側のタブはそのまま残ります。[HT]がタブを表しています。
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からCR、LFの続く制御文字を取り除きます。CRLFはWindowsでよく使われる改行を意味する制御文字です。
DIM string = "改行<#CR>改行"
PRINT REPLACE(string, CHR(13) + CHR(10), "")
- 結果
改行改行
CRだけ取り除く場合は、以下のように記述します。
DIM string = "改行<#CR>改行"
PRINT REPLACE(string, CHR(13), "")
- 結果
改行[LF]改行
LFだけ取り除く場合は、以下のように記述します。
DIM string = "改行<#CR>改行"
PRINT REPLACE(string, CHR(10), "")
- 結果
改行[CR]改行
全角スペース
第二引数にTrueを指定すると両端の全角スペースを取り除くことができます。
DIM string = " 全角スペース "
PRINT TRIM(string)
PRINT TRIM(string, TRUE)
- 結果
全角スペース 全角スペース
制御文字
以下のプログラムはTRIM関数で制御文字を取り除くプログラムです。UWSC Debuggerでは制御文字の入力ができないため、サクラエディタで編集して実行しています。
実行時は制御文字を直接入力してテストしていますが、制御文字は通常見えなく区別もつかないため可視化しています。[ ]で囲まれたアルファベットが制御文字を表しています。以下のプログラムは制御文字を直接入力しているわけではないため、実行しても制御文字は取り除くことはできません。
TRIM関数を実行する前の文字数と実行した後の文字数を比較し、変化があれば制御文字を取り除けたと判定しTrueを、取り除けなければFalseと出力しています。
以下の結果からわかるように0x00〜0x1Fの範囲の制御文字はTRIM関数で取り除くことができますが、0x7Fの削除(DEL)のみは取り除くことができません。
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
- 結果
トリム前, トリム後, トリム有無 [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の形式で取得します。
PRINT TRIM(POWERSHELL("[Management.ManagementDateTimeConverter]::ToDateTime((Get-WmiObject Win32_OperatingSystem).LastBootUpTime)"))
2019年12月21日 15:53:56
ファイルを開いているプロセスを調べる
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