約 391,549 件
https://w.atwiki.jp/r-intro/pages/13.html
目次 目次 基本操作 文字列型ベクトルを作成する 文字型ベクトルの宣言と初期化 文字列の長さを得る 文字列を連結する 文字列を連結する 文字列を比較する 文字列の指定した一部を取り出す 文字列の前後の空白を取り除く 文字列を特定の文字または文字列で分割する 同じ文字列が繰り返された文字列を作る 文字列を一文字ずつ分割する バイト列を扱う 文字列型ベクトルの要素の文字列を連結する 文字列型ベクトルの要素の文字列を連結する strsplit関数とstr_split関数の動作の違い 文字コード 文字の文字コードを数値で得る 文字コードから文字を得る 現在の環境の文字コードの種類を得る 文字の文字コードを調べる 文字列から各文字の文字コードを得る 任意の文字コードから文字列を作成する 文字列の文字コードを調べる 区点番号からJISコードを得る JISコードから区点番号を得る 変換 文字列を数値に変換する 数値を文字列に変換する 英字を大文字(小文字)に変換する 文字の全角半角変換 文字列の文字コードを変換する iconv関数で文字列を変換するとバイト列の先頭に「FE FF」や「1B 24 42」が付く その他 エスケープシーケンスによる文字を表示する 指定された数の空白(0x20)からなる文字列を得る 文字列を特定の文字または文字列で分割する CIDから文字を得る 文字からCIDを得る 連番による連続した文字列を作成する 絶対パスを表す文字列からファイル名(ディレクトリ名)だけを取り出す ランダムに作成された文字列を得る ランダムに作成された文字列を得る ランダムに作成された文字列を得る 文字列のハッシュ値を得る 基本操作 文字列型ベクトルを作成する 文字列を二重引用符”で囲んで文字列リテラルを作り、c関数でベクトル化して代入演算子<-で代入する。 s - "ABC" print(s) [1] "ABC" s - c("ABC", "あいう", "阿伊宇abc") print(s) [1] "ABC" "あいう" "阿伊宇abc" 文字型ベクトルの宣言と初期化 文字や文字列を扱うための変数(ベクトル)を使うには、その文字列を格納する領域を用意して、それに名前を付ける必要がある。これを宣言という。 二重引用符”で囲んだ文字の並びを文字列リテラルといい、この文字列リテラルをc関数などを使うことにより宣言する。二重引用符の間に何も含まれない場合は、長さ0の文字列となる。 s エラー オブジェクト s がありません s - "あいう" print(s) [1] "あいう" s - c("A", "AB", "", "あ") print(s) [1] "A" "AB" "" "あ" character関数に数値を与えると、長さが0の文字列を指定した個数だけ作成する。文字列を1つも含まない文字型ベクトルを作るには引数に0を与える。ベクトルの長さを得るにはlength関数を使う。 length(c("A", "AB", "あ", "z")) [1] 4 character(3) [1] "" "" "" length(character(3)) [1] 3 character(0) character(0) length(character(0)) [1] 0 文字列の長さを得る nchar関数を使う。typeオプションに指定したいずれかの値で結果が変わる。なお、以下はWindows版で実行している。 bytes…バイト数 chars…文字の個数 width…画面表示される文字の幅(いわゆる半角は1、全角は2) s - c("ABC", "あいう", "阿伊宇abc") nchar(s, type = "bytes") [1] 3 6 9 nchar(s, type = "chars") [1] 3 3 6 nchar(s, type = "width") [1] 3 6 9 bytesとwidthは同じに見えるが、それはWindows環境下では日本語文字が1文字当たり2バイトだからであり、例えばutf-8(1文字3バイト)であれば以下のようになる。Windows環境下であるので一部は動作しない。 s - iconv("あ亜", from = "CP932", to = "utf-8") charToRaw(s) [1] e3 81 82 e4 ba 9c nchar(s, type = "bytes") [1] 6 nchar(s, type = "chars") nchar(s, type = "chars") でエラー invalid multibyte string, element 1 nchar(s, type = "width") [1] NA 文字列を連結する paste関数を使う。オプションを特に指定しないと空白(0x20)で引数に与えた文字列リテラルを連結する。単純に連結したいのであればsepオプションに""を指定する。 s1 - "ABC" s2 - "あいう" s3 - "阿伊宇abc" paste(s1, s2, s3) [1] "ABC あいう 阿伊宇abc" paste(s1, s2, s3, sep = "") [1] "ABCあいう阿伊宇abc" 文字列を連結する paste関数を使う。オプションを特に指定しないと空白(0x20)で引数に与えた文字列リテラルを連結する。単純に連結したいのであればsepオプションに""を指定する。 s1 - "ABC" s2 - "あいう" s3 - "阿伊宇abc" paste(s1, s2, s3) [1] "ABC あいう 阿伊宇abc" paste(s1, s2, s3, sep = "") [1] "ABCあいう阿伊宇abc" paste0関数を使ってもよい。paste0関数はpaste関数のsepオプションがデフォルトで""を指定された状態で実行される。 s - c("ABC", "123", "あいう") paste(s, sep = "") [1] "ABC" "123" "あいう" paste0(s) [1] "ABC" "123" "あいう" なお、paste関数もpaste0関数も、引数は文字列に強制変換してから処理する(最初にas.character関数を使用するのと同等)。 paste(1 10) [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" paste(c(1.1, 2.2, -3.3, 4.44)) [1] "1.1" "2.2" "-3.3" "4.44" 引数の処理は少々複雑で、与えた引数の文字列ベクトルを連結することもできるし、その文字列ベクトル内の文字列を連結させることもできる。前者の区切り文字はsepオプションに、後者の区切り文字はcollapseオプションに指定する。二つを同時にも処理することができる。 s1 - c("ABC", "123", "あいう") s2 - c("DEF", "456", "えお") paste(s1, s2, sep = "") [1] "ABCDEF" "123456" "あいうえお" paste(s1, s2, sep = "", collapse = "") [1] "ABCDEF123456あいうえお" paste(s1, s2, sep = ";", collapse = "@") [1] "ABC;DEF@123;456@あいう;えお" paste0(s1, s2, collapse = "") [1] "ABCDEF123456あいうえお" paste0(s1, s2, collapse = "@") [1] "ABCDEF@123456@あいうえお" 文字列を比較する ==演算子を使う。完全に一致すればTRUE、一文字でも異なればFALSEを返す。 "A" == "A" [1] TRUE "A" == "B" [1] FALSE "ABC" == "ABC" [1] TRUE "ABc" == "ABC" [1] FALSE "ABC" == "ABCD" [1] FALSE "ABCD" == "ABC" [1] FALSE ベクトルを利用した比較もできる。 s1 - c("A", "B", "C") s2 - c("A", "B", "c") s1 == s2 [1] TRUE TRUE FALSE 文字列の指定した一部を取り出す substr関数を使う。引数には抜き出す文字列の何文字目(1~)から何文字目までと指定する。 s - c("ABCDEFG", "あいうえお", "阿伊ab") substr(s, 2, 4) [1] "BCD" "いうえ" "伊ab" 何文字目の指定にめちゃくちゃな値を与えると、取り出せる分を取り出してくれる。 substr(s, 2, -2) [1] "" "" "" substr(s, -3, 2) [1] "AB" "あい" "阿伊" substr(s, 2, 10) [1] "BCDEFG" "いうえお" "伊ab" ベクトルの機能を活用すれば、例えば後ろから2文字だけ抜き出すといったこともできる。 substr(s, nchar(s) - 1, nchar(s)) [1] "FG" "えお" "ab" 文字列の前後の空白を取り除く trimws関数を使う。オプションを特に指定しなければ、文字列の前後の空白(とタブ(0x09)と復帰(CR,\r,0x0d)と改行(LF,\n,\x0a))を取り除く。第二引数に"left"と"right"をそれぞれ指定すると、前の空白だけ、後ろの空白だけを取り除く。デフォルトは両方(both)となっている。 s - " Hello. " trimws(s) [1] "Hello." trimws(s, "left") [1] "Hello. " trimws(s, "right") [1] " Hello." なお、いわゆる全角空白(0x8140)はそのままでは取り除くことができない。 s - " あいうえお " trimws(s) [1] " あいうえお" ヘルプによると、whitespaceオプションに取り除く文字を正規表現で指定し、その指定に従って取り除いているとのこと。デフォルトは"[ \t\r\n]"。これに全角空白分を加えた文字列を指定すると、全角空白も同時に取り除くことができる。以下は、シフトJISの環境で行った例。 trimws(s, whitespace = "[ \t\r\n]") [1] " あいうえお" trimws(s, whitespace = "[ \t\r\n ]") [1] "あいうえお" trimws(s, whitespace = "[ \t\r\n\x81\x40]") [1] "あいうえお" 文字列を特定の文字または文字列で分割する strsplit関数を使う。分割する文字列はベクトルで与えることができる。戻り値はリスト。分割させる文字または文字列は正規表現で指定することができる。 s - c("A B C", " D E F ") strsplit(s, " ") [[1]] [1] "A" "B" "C" [[2]] [1] "" "D" "E" "" "F" 上の例では、1つの空白(0x20)で分割しようとしたが、ベクトルの2番目の要素は与えた文字列の先頭や最後に空白が含まれており、文字間の空白も1つ以上のため、分割がうまくいっていない。このような場合はあらかじめ前後の空白をtrimws関数で取り除き、正規表現のパターンを「[ ]+」(1つ以上の連続した空白(0x20))とすればよい。 strsplit(trimws(s), "[ ]+") [[1]] [1] "A" "B" "C" [[2]] [1] "D" "E" "F" strsplit関数の戻り値はリストであり、これをベクトルにする場合はunlist関数を使う。 unlist(strsplit(trimws(s), "[ ]+")) [1] "A" "B" "C" "D" "E" "F" 規則性なく空白が含まれるCSVの文字列の場合は、以下のような分割パターンを正規表現で与えれば、うまく分割することができる。 s - " A, B,C " strsplit(trimws(s), "[ ,]+") [[1]] [1] "A" "B" "C" 同じ文字列が繰り返された文字列を作る そのような機能を実現する演算子や関数はRには標準で搭載されていない。paste関数とrep関数を組み合わせて使う。 paste(rep("A", 3), collapse = "") [1] "AAA" paste(rep("Abc", 4), collapse = "") [1] "AbcAbcAbcAbc" 文字列を一文字ずつ分割する strsplit関数を使う。第一引数に文字列を、第二引数に "" を指定すると、一文字ずつ分割する。 s - "ABc あいう" strsplit(s, "") [[1]] [1] "A" "B" "c" " " "あ" "い" "う" strsplit関数の引数はベクトルを受け付けるため、戻り値は与えたベクトルごとに分けてリストで戻る。unlist関数を使うことで戻り値をベクトルに変換することができる。 strsplit(c("ABC", "123"), "") [[1]] [1] "A" "B" "C" [[2]] [1] "1" "2" "3" unlist(strsplit(s, "")) [1] "A" "B" "c" " " "あ" "い" "う" 文字列の先頭や末尾の空白もきちんと一文字ずつ分解する。 unlist(strsplit(" あい う 12 ", "")) [1] " " "あ" "い" " " " " "う" " " "1" "2" " " " " バイト列を扱う 数値や文字などの情報を、8ビットずつ区切って表したものがバイト列。Rで扱うにはロウ型を使う。 rw - as.raw(c(1, 2, 0xa)) print(rw) [1] 01 02 0a as.integer(rw) [1] 1 2 10 as.integer(rw) + 20 [1] 21 22 30 文字列をロウ型に変換するにはcharToRaw関数を、ロウ型を文字列に変換するにはrawToChar関数を使う。 rw - charToRaw("ABC123") print(rw) [1] 41 42 43 31 32 33 as.raw(as.integer(rw) + 1) [1] 42 43 44 32 33 34 rawToChar(as.raw(as.integer(rw) + 1)) [1] "BCD234" 日本語も扱える。以下は、UTF-8の環境下で行った例。 rw - charToRaw("ABあいう12") print(rw) [1] 41 42 e3 81 82 e3 81 84 e3 81 86 31 32 print(rw[3 5]) [1] e3 81 82 print(rawToChar(rw[3 5])) [1] "あ" 文字列型ベクトルの要素の文字列を連結する 文字列型ベクトル同士ではなく文字列型ベクトルの要素の文字列同士を連結するには、paste関数にcollapseオプションを付けて使う。paste関数は引数に与えたベクトルをベクトルで処理しようとするため、デフォルトでは与えたベクトル同士を連結しようとするが、collapseオプションを指定すると、与えた文字列型ベクトル内の文字列を連結する。文字列の間に何も挟みたくなければ""を指定する。 s - c("石見舞菜香", "優木かな", "和多田美咲") paste(s, sep = "") [1] "石見舞菜香" "優木かな" "和多田美咲" paste(s, collapse = "") [1] "石見舞菜香優木かな和多田美咲" paste(s, collapse = "_") [1] "石見舞菜香_優木かな_和多田美咲" 文字列型ベクトルの要素の文字列を連結する 文字列型ベクトル同士ではなく文字列型ベクトルの要素の文字列同士を連結するには、stringrパッケージのstr_c関数にcollapseオプションを付けて使う。str_c関数は引数に与えたベクトルをベクトルで処理しようとするため、デフォルトでは与えたベクトル同士を連結しようとするが、collapseオプションを使うと、与えた文字列型ベクトルの要素同士を連結する。文字列の間に何も挟みたくなければ""を指定する。 library(stringr) s - c("石見舞菜香", "優木かな", "和多田美咲") str_c(s) [1] "石見舞菜香" "優木かな" "和多田美咲" str_c(s, collapse = "") [1] "石見舞菜香優木かな和多田美咲" str_c(s, collapse = "_") [1] "石見舞菜香_優木かな_和多田美咲" strsplit関数とstr_split関数の動作の違い strsplit関数とstringrパッケージのstr_split関数は、どちらも正規表現を使用して文字列を分割する関数だが、動作が若干異なる。以下の例のとおり、分割に指定した文字が文字列の最後に存在すると、strsplit関数はその最後の分割された文字列("")を返すことを省略するので注意。どちらも戻り値はリストである。 s - character(5) s[1] - "//ウマ娘/アグネスデジタル/鈴木みのり" s[2] - "/ウマ娘/ライスシャワー/石見舞菜香" s[3] - "ウマ娘/メイショウドトウ/和多田美咲" s[4] - "ウマ娘/サクラチヨノオー/野口瑠璃子/" s[5] - "ウマ娘/メジロアルダン/会沢紗弥//" strsplit(s, "/") [[1]] [1] "" "" "ウマ娘" "アグネスデジタル" "鈴木みのり" [[2]] [1] "" "ウマ娘" "ライスシャワー" "石見舞菜香" [[3]] [1] "ウマ娘" "メイショウドトウ" "和多田美咲" [[4]] [1] "ウマ娘" "サクラチヨノオー" "野口瑠璃子" [[5]] [1] "ウマ娘" "メジロアルダン" "会沢紗弥" "" stringr str_split(s, "/") [[1]] [1] "" "" "ウマ娘" "アグネスデジタル" "鈴木みのり" [[2]] [1] "" "ウマ娘" "ライスシャワー" "石見舞菜香" [[3]] [1] "ウマ娘" "メイショウドトウ" "和多田美咲" [[4]] [1] "ウマ娘" "サクラチヨノオー" "野口瑠璃子" "" [[5]] [1] "ウマ娘" "メジロアルダン" "会沢紗弥" "" "" どちらの関数も、分割する文字列の指定に正規表現を使うことができる。 s - character(3) s[1] - "ウオッカ/大橋彩香" s[2] - "ゴールドシチー//香坂さき" s[3] - "スーパークリーク///優木かな" str_split(s, "/+") [[1]] [1] "ウオッカ" "大橋彩香" [[2]] [1] "ゴールドシチー" "香坂さき" [[3]] [1] "スーパークリーク" "優木かな" strsplit(s, "/+") [[1]] [1] "ウオッカ" "大橋彩香" [[2]] [1] "ゴールドシチー" "香坂さき" [[3]] [1] "スーパークリーク" "優木かな" str_split_1関数は機能はほぼ同じで戻り値がベクトルになる関数。ただし、要素数が1つのベクトルしか扱うことができない。 str_split_1(s, "/+") Error in `str_split_1()` ! `string` must be a single string, not a character vector. Run `rlang last_trace()` to see where the error occurred. str_split_1(s[1], "/+") [1] "ウオッカ" "大橋彩香" 文字コード 文字の文字コードを数値で得る charToRaw関数で文字をロウ型に変換し、それをas.integer関数で数値型に変換することで得られる。得られた文字コードの数値の値は、as.raw関数でロウ型に変換し、rawToChar関数で文字型に変換することで文字に戻すことができる。以下は、文字「A」(0x41)を数値型に変換し、その値に1を足して文字の「B」(0x42)を得た例。 r - charToRaw("A") r [1] 41 n - as.integer(r) n [1] 65 rawToChar(as.raw(65 + 1)) [1] "B" 文字列にもそのまま使うことができる。 n - as.integer(charToRaw("ABCabc")) n [1] 65 66 67 97 98 99 rawToChar(as.raw(n + 1)) [1] "BCDbcd" 日本語文字にも使える。「阿」、「伊」はそれぞれシフトJISで0x88a2、0x88c9。charToRaw関数の戻り値はロウ型であることに注意。 Sys.getlocale() [1] "LC_COLLATE=Japanese_Japan.932;LC_CTYPE=Japanese_Japan.932;LC_MONETARY=Japanese_Japan.932;LC_NUMERIC=C;LC_TIME=Japanese_Japan.932" s - c("A", "ab", "あい", "阿伊123") for (i in 1 length(s)) print(charToRaw(s[i])) [1] 41 [1] 61 62 [1] 82 a0 82 a2 [1] 88 a2 88 c9 31 32 33 for (i in 1 length(s)) print(as.integer(charToRaw(s[i]))) [1] 65 [1] 97 98 [1] 130 160 130 162 [1] 136 162 136 201 49 50 51 文字コードから文字を得る rawToChar関数にロウ型で文字コードを与えればよい。以下はShift-JIS環境で実行した例。ASCIIコードで「A」は0x41、「1」は0x31、Shift-JISでは「朝」は0x92a9、「昼」は0x928b、「夜」は0x96e9。 rawToChar(as.raw(c(0x41, 0x31))) [1] "A1" rawToChar(as.raw(c(0x92, 0xa9, 0x92, 0x8b, 0x96, 0xe9))) [1] "朝昼夜" rawToChar(as.raw(c(0x0d, 0x0a))) [1] "\r\n" エスケープシーケンスによる文字はそれが分かるように表示され、文字として割り当てられていない値の場合は、与えた値がそのまま返される。 rawToChar(as.raw(c(0x0d, 0x0a))) [1] "\r\n" rawToChar(as.raw(c(0xff, 0x0a))) [1] " ff \n" rawToChar(as.raw(c(0xff, 0xfe))) [1] " ff fe " rawToChar(as.raw(c(0x92, 0xff))) [1] " 92 ff " 現在の環境の文字コードの種類を得る localeToCharset関数を使う。引数に何も与えないと、現在の環境の、文字コードの種類を返す。 例えば、Windows版のバージョン4.1.3であれば、以下のようになるはず。 localeToCharset() [1] "CP932" Windows版のバージョン4.2.2であれば、以下のようになるはず。 localeToCharset() [1] "UTF-8" ロケールが返されるのではなく、文字コードの種類が返されることに注意。 文字の文字コードを調べる charToRaw関数を使う。以下は、Windows環境下(シフトJIS)で行った例。 r - charToRaw("か") r [1] 82 a9 r + 1 r + 1 でエラー 二項演算子の引数が数値ではありません n - as.integer(r) n [1] 130 169 rawToChar(as.raw(c(130, 169))) [1] "か" 文字列にも使える。 charToRaw("あいうABC阿伊宇") [1] 82 a0 82 a2 82 a4 41 42 43 88 a2 88 c9 89 46 n - as.integer(charToRaw("あいうABC阿伊宇")) n [1] 130 160 130 162 130 164 65 66 67 136 162 136 201 137 70 rawToChar(as.raw(n)) [1] "あいうABC阿伊宇" 文字列から各文字の文字コードを得る iconv関数で指定の文字列を変換してそれをcharToRaw関数でロウ型に変換すると文字コードがバイト列で表示される。 Sys.getlocale() [1] "LC_COLLATE=Japanese_Japan.utf8;LC_CTYPE=Japanese_Japan.utf8;LC_MONETARY=Japanese_Japan.utf8;LC_NUMERIC=C;LC_TIME=Japanese_Japan.utf8" charToRaw(iconv("阿", to = "ISO-2022-JP")) # JIS [1] 1b 24 42 30 24 charToRaw(iconv("阿", to = "SJIS")) # シフトJIS [1] 88 a2 charToRaw(iconv("阿", to = "UTF-8")) # UTF-8 [1] e9 98 bf charToRaw(iconv("阿", to = "UTF-16")) # UTF-16(ビッグエンディアン) [1] fe ff 96 3f charToRaw(iconv("阿", to = "UTF-16BE")) # UTF-16(ビッグエンディアン) [1] 96 3f charToRaw(iconv("阿", to = "UTF-16LE")) # UTF-16(リトルエンディアン) [1] 3f 96 charToRaw(iconv("阿", to = "unicodeFFFE")) # Unicode [1] 96 3f iconv関数に与える文字は文字列でもかまわない。ただし、要素が1つだけ(長さが1)の文字ベクトルでなければならない。 charToRaw(iconv("阿位鵜", to = "SJIS")) [1] 88 a2 88 ca 89 4c charToRaw(iconv(c("阿位", "鵜江"), to = "SJIS")) [1] 88 a2 88 ca 警告メッセージ charToRaw(iconv(c("阿位", "鵜江"), to = "SJIS")) で 引数は長さ 1 の文字ベクトルである必要があります 最初の要素以外は全て無視されます 任意の文字コードから文字列を作成する iconv関数、rawToChar関数、as.raw関数を組み合わせて使用する。以下は文字コードがUTF-8の環境で行った例。toオプションを省略すると自動的に現在の環境のUTF-8て出力されるため、以下の例ではtoオプションは省略可能。それぞれ順番にシフトJIS、UTF-8、UTF-16(ビッグエンディアン)、UTF-16(ビッグエンディアン)、UTF-16(リトルエンディアン)、Unicodeの文字コード(バイト列)からにそれぞれ文字列「阿位」を作成している。 Sys.getlocale() [1] "LC_COLLATE=Japanese_Japan.utf8;LC_CTYPE=Japanese_Japan.utf8;LC_MONETARY=Japanese_Japan.utf8;LC_NUMERIC=C;LC_TIME=Japanese_Japan.utf8" iconv(rawToChar(as.raw(c(0x88, 0xa2, 0x88, 0xca))), from = "SJIS", to = "UTF-8") [1] "阿位" iconv(rawToChar(as.raw(c(0xe9, 0x98, 0xbf, 0xe4, 0xbd, 0x8d))), from = "UTF-8", to = "UTF-8") [1] "阿位" iconv(rawToChar(as.raw(c(0x96, 0x3f, 0x4f, 0x4d))), from = "UTF-16", to = "UTF-8") [1] "阿位" iconv(rawToChar(as.raw(c(0x96, 0x3f, 0x4f, 0x4d))), from = "UTF-16BE", to = "UTF-8") [1] "阿位" iconv(rawToChar(as.raw(c(0x3f, 0x96, 0x4d, 0x4f))), from = "UTF-16LE", to = "UTF-8") [1] "阿位" iconv(rawToChar(as.raw(c(0x96, 0x3f, 0x4f, 0x4d))), from = "unicodeFFFE", to = "UTF-8") [1] "阿位" 文字列の文字コードを調べる iconv関数を使う。iconv関数は第1引数に指定した文字列を、toオプションに指定した文字コードに変換する。toオプションだけを指定した場合は変換後の文字列をそのまま返すが、実行環境と文字コードが合わない場合は表示が乱れるので注意。TRUEを指定したtoRawオプションを付けると、戻り値はロウ型になりバイト列で表示されるため、このオプションを使用した利用が推奨される。 以下は、「石見舞菜香」という5つの漢字からなる文字列について、文字コードをバイト列で表示した例。なお、各漢字のそれぞれの文字コードは以下のとおり。実行した環境の文字コードはUTF-8で、JISコードとシフトJISにそれぞれ変換している。toRawオプションにTRUEを指定した場合の戻り値はロウ型かつリストであることに注意。ロウ型はバイト列で表示される。 漢字 JISコード シフトJIS UTF-8 石 0x4050 0x90ce 0xe79fb3 見 0x382b 0x8ca9 0xe8a68b 舞 0x4971 0x9591 0xe8889e 菜 0x3a5a 0x8dd8 0xe88f9c 香 0x3961 0x8d81 0xe9a699 実行例は以下のとおり。 Sys.getlocale() [1] "LC_COLLATE=Japanese_Japan.utf8;LC_CTYPE=Japanese_Japan.utf8;LC_MONETARY=Japanese_Japan.utf8;LC_NUMERIC=C;LC_TIME=Japanese_Japan.utf8" iconv("石見舞菜香", to = "ISO-2022-JP") [1] "\033$B@P8+Iq Z9a" iconv("石見舞菜香", to = "ISO-2022-JP", toRaw = TRUE) [[1]] [1] 1b 24 42 40 50 38 2b 49 71 3a 5a 39 61 iconv("石見舞菜香", to = "SJIS", toRaw = TRUE) [[1]] [1] 90 ce 8c a9 95 91 8d d8 8d 81 iconv("石見舞菜香", to = "UTF-8", toRaw = TRUE) [[1]] [1] e7 9f b3 e8 a6 8b e8 88 9e e8 8f 9c e9 a6 99 iconv関数は現在の環境の文字コードに関係なく、引数に与えた任意の文字コードからなる文字列を、任意の文字コードまたは任意の文字コードによる文字列に変換する関数。よって、以下の例のようにUTF-8環境下でシフトJISに相当するバイト列をロウ型で与えてfromオプションにシフトJISを指定することで、任意の文字コードを変換することができる。最後の例では、符号化文字集合の切り替えを示すエスケープシーケンス(0x1b 0x24 0x42)が先頭に付けられていることに注意。 ra - as.raw(c(0x95, 0x91, 0x8d, 0xd8, 0x8d, 0x81)) iconv(rawToChar(ra), from = "SJIS", to = "UTF-8") [1] "舞菜香" iconv(rawToChar(ra), from = "SJIS", to = "UTF-8", toRaw = TRUE) [[1]] [1] e8 88 9e e8 8f 9c e9 a6 99 iconv(rawToChar(ra), from = "SJIS", to = "ISO-2022-JP", toRaw = TRUE) [[1]] [1] 1b 24 42 49 71 3a 5a 39 61 iconv関数の第1引数にベクトルで文字列を与えると、それぞれ変換した値を返す。 iconv(c("石見舞菜香", "和多田美咲"), to = "SJIS", toRaw = TRUE) [[1]] [1] 90 ce 8c a9 95 91 8d d8 8d 81 [[2]] [1] 98 61 91 bd 93 63 94 fc 8d e7 区点番号からJISコードを得る 以下の自作関数kutenToJisは、区点番号を与えるとそのJISコードを返す。 kutenToJis - function(ku, ten) { s12 - as.hexmode(ku + 0x20) s34 - as.hexmode(ten + 0x20) s - sprintf("0x%s%s", s12, s34) return(as.integer(s)) } 以下の2つの漢字で動作確認をする。 美 - 区点番号:4094, JISコード:0x487e(10進数 18558) 雲 - 区点番号:1732, JISコード:0x3140(10進数 12608) 動作例。 kutenToJis - function(ku, ten) { + s12 - as.hexmode(ku + 0x20) + s34 - as.hexmode(ten + 0x20) + s - sprintf("0x%s%s", s12, s34) + return(as.integer(s)) + } kutenToJis(40, 94) [1] 18558 jis - kutenToJis(40, 94) print(jis) [1] 18558 print(as.hexmode(jis)) [1] "487e" jis - kutenToJis(17, 32) print(jis) [1] 12608 print(as.hexmode(jis)) [1] "3140" JISコードから区点番号を得る 以下の自作関数kutenToJisは、JISコードを与えると区点番号を返す。 jisToKuten - function(jis) { s - sprintf("%04x", jis) n1 - as.integer(sprintf("0x%s", substr(s, 1, 2))) - 0x20 n2 - as.integer(sprintf("0x%s", substr(s, 3, 4))) - 0x20 return(c(n1, n2)) } 以下の2つの漢字で動作確認をする。 美 - JISコード:0x487e(10進数 18558), 区点番号:4094 雲 - JISコード:0x3140(10進数 12608), 区点番号:1732 動作例。 jisToKuten - function(jis) { + s - sprintf("%04x", jis) + n1 - as.integer(sprintf("0x%s", substr(s, 1, 2))) - 0x20 + n2 - as.integer(sprintf("0x%s", substr(s, 3, 4))) - 0x20 + return(c(n1, n2)) + } kuten - jisToKuten(0x487e) print(kuten) [1] 40 94 length(kuten) [1] 2 kuten - jisToKuten(12608) print(kuten) [1] 17 32 length(kuten) [1] 2 変換 文字列を数値に変換する as.numeric関数を使う。 s - c("1", "2.2", "-3.3") as.numeric(s) [1] 1.0 2.2 -3.3 s - c("A", "2.2", "- 3.3") as.numeric(s) [1] NA 2.2 NA 警告メッセージ 強制変換により NA が生成されました 数値に変換できる文字列は浮動小数点数に変換される。数値に変換できない文字列はNAになる。 整数もしくは浮動小数点数に恣意的に変換したい場合はas.integer関数もしくはas.double関数を使う。 s - c("0", "1", "2.2", "-3.3") as.integer(s) [1] 0 1 2 -3 as.double(s) [1] 0.0 1.0 2.2 -3.3 数値を文字列に変換する 簡単に変換するならas.character関数、変換時に書式を指定したいのであればsprintf関数を使う。 n - c(1, 2, -4) d - c(1.1, 0.1, -2.2) as.character(n) [1] "1" "2" "-4" as.character(d) [1] "1.1" "0.1" "-2.2" sprintf("%03d", n) [1] "001" "002" "-04" sprintf("%+04d", n) [1] "+001" "+002" "-004" sprintf("%8.4f", d) [1] " 1.1000" " 0.1000" " -2.2000" 英字を大文字(小文字)に変換する toupper関数とtolower関数は、引数に指定した文字型データに含まれる英字を、それぞれ一括で大文字、小文字に変換する。英字ではない文字は変換せずにそのまま返す。 s - c("A", "bc", "D E", "あ い") toupper(s) [1] "A" "BC" "D E" "あ い" tolower(s) [1] "a" "bc" "d e" "あ い" 文字の全角半角変換 stringiパッケージのstri_trans_general関数を使う。以下、変換例。 library(stringi) s - c("あい", "宇", "イヌ", "ネコ", "AB@", "CD{", "12", "34") stri_trans_general(s, "Halfwidth-Fullwidth") [1] "あい" "宇" "イヌ" "ネコ" "AB@" "CD{" "12" "34" stri_trans_general(s, "Fullwidth-Halfwidth") [1] "あい" "宇" "イヌ" "ネコ" "AB@" "CD{" "12" "34" 全角→半角変換には"Fullwidth-Halfwidth"を、半角→全角変換には"Halfwidth-Fullwidth"を指定する。英数字、カタカナ、記号など変換できるものはすべて変換するので注意。該当しない文字(ひらがな、漢字)は変換されない。 文字列の文字コードを変換する iconv関数を使う。以下の例では、シフトSJISの環境下で、以下の3行からなるUTF-8(改行コードはCR+LF)で保存されたテキストファイル(ファイル名はutf8.txt)を直接読み込み、それをUTF-8からシフトJISに保存をしている。 ABC あいう 阿位宇 ファイルを読み込み、文字列を変換する。 scan("utf8.txt", what = character(), fileEncoding = "UTF-8") Read 3 items [1] "ABC" "あいう" "阿位宇" ch - readChar("utf8.txt", 27, useBytes = TRUE) print(ch) [1] "ABC\r\n縺ゅ>縺 86 \r\n髦ソ菴榊ョ 87 \r\n" iconv(ch, from = "UTF-8", to = "SJIS") [1] "ABC\r\nあいう\r\n阿位宇\r\n" iconv関数で文字列を変換するとバイト列の先頭に「FE FF」や「1B 24 42」が付く 「FE FF」はUnicodeにおけるBOM(バイトオーダーマーク)、「1B 24 42」はJISコードにおけるエスケープシーケンス。 UnicodeのUTF-16では、文字列を表現するバイト列のそのバイトの格納する順番を指定することができ、上位バイトを先に記述することをビッグエンディアン、下位バイトを先に記述する方法をリトルエンディアンという。「あ」(JIS:0x2422、UTF-16:0x3042)と「亜」(JIS:0x3021、UTF-16:0x4E9c)の二文字を使って試してみる。 以下は、シフトJIS(CP932)の環境で、文字列「あ亜」をUTF-16に変換した例。 charToRaw(iconv("あ亜", from = "CP932", to = "UTF-16")) [1] fe ff 30 42 4e 9c charToRaw(iconv("あ亜", from = "CP932", to = "UTF-16BE")) [1] 30 42 4e 9c charToRaw(iconv("あ亜", from = "CP932", to = "UTF-16LE")) [1] 42 30 9c 4e 1番目の例ではエンディアンを指定しないため、「FE FF」(関数の戻り値は小文字で「fe ff」)が付けられてビッグエンディアンであることが明示されている。2番目はビッグエンディアンを指定、3番目はリトルエンディアンを指定した例。 同様にJISコード(ISO-2022-JP)に変換してみる。 charToRaw(iconv("あ亜", from = "CP932", to = "ISO-2022-JP")) [1] 1b 24 42 24 22 30 21 「あ亜」のバイト列(24 22 30 21)の前に「1B 24 42」(関数の戻り値は小文字で「1b 24 42」)が付けられている。これは以降のバイト列がJISコードによる文字列であることを明示するためのバイト列。UTF-16と異なり、iconv関数でJISコードへの変換時にエスケープシーケンスを付けないようにすることはできない。 その他 エスケープシーケンスによる文字を表示する \n(改行)や\r(復帰)などが含まれている文字列は、ただ表示させると、その拡張表記のままに表示されてしまう。 s1 - "Hi." s2 - "Hello.\n" s3 - "Hi.\rHello." cat(s1) Hi. cat(s2) Hello. cat(s3) Hi. Hello. print関数を使うと、拡張表記による文字は、その拡張表記そのままに¥記号を使って表示する。 print(s1) [1] "Hi." print(s2) [1] "Hello.\n" print(s3) [1] "Hi.\rHello." 指定された数の空白(0x20)からなる文字列を得る C#でいうところのStrings.Spaceメソッド。そのような機能を持つ関数はRには標準で搭載されていないためその機能を持つ関数を自作する。以下の3行がその自作関数。 space - function(n) { return(paste(rep(" ", n), collapse = "")) } 試しに使ってみる space(5) [1] " " paste("A", space(1), "B", space(2), "C", sep = "") [1] "A B C" 文字列を特定の文字または文字列で分割する stringrパッケージのstr_split関数を使う。分割する文字列はベクトルで与えることができる。戻り値はリスト。分割させる文字または文字列は正規表現で指定することができる。 library(stringr) s - c("A B C", " D E F ") str_split(s, " ") [[1]] [1] "A" "B" "C" [[2]] [1] "" "D" "E" "" "F" "" 上の例では、1つの空白(0x20)で分割しようとしたが、ベクトルの2番目の要素は与えた文字列の先頭や最後に空白が含まれており、文字間の空白も1つ以上のため、分割がうまくいっていない。このような場合はあらかじめ前後の空白をtrimws関数で取り除き、正規表現のパターンを「[ ]+」(1つ以上の連続した空白(0x20))とすればよい。 str_split(trimws(s), "[ ]+") [[1]] [1] "A" "B" "C" [[2]] [1] "D" "E" "F" strsplit関数の戻り値はリストであり、これをベクトルにする場合はunlist関数を使う。 unlist(str_split(trimws(s), "[ ]+")) [1] "A" "B" "C" "D" "E" "F" 規則性なく空白が含まれるCSVの文字列の場合は、以下のような分割パターンを正規表現で与えれば、うまく分割することができる。 unlist(str_split(trimws(s), "[ ,]+")) [1] "A" "B" "C" CIDから文字を得る ここからファイルaj17-kanji.txtをダウンロードしてカレントディレクトリに置き、以下のコマンドを実行する。 library(tidyverse) tbl - read_delim("aj17-kanji.txt", delim = "\t", comment = "#", col_names = FALSE, progress = FALSE, show_col_types = FALSE) cid0 - tbl[[1]] ucd0 - tbl[[19]] idx - which(nchar(ucd0) == 6) cid - cid0[idx] ucd - ucd0[idx] h1 - as.integer(as.hexmode(substr(ucd, 3, 4))) h2 - as.integer(as.hexmode(substr(ucd, 5, 6))) mx - matrix(c(h1, h2), ncol = 2) 上記は処理を簡単にするため、Unicodeが16進数表記で「U+」を除く4桁の文字のみ取り出している。CIDを指定して、文字を取り出してみる。最後の例のとおり、文字が割り当てられていないCIDを指定すると、文字列の空欄が返る。 idx - which(cid == 2000) # CIDの2000が示す文字は「江」 print(iconv(rawToChar(as.raw(mx[idx, ])), from = "unicodeFFFE")) [1] "江" idx - which(cid == 4000) # CIDの4000が示す文字は「輪」 print(iconv(rawToChar(as.raw(mx[idx, ])), from = "unicodeFFFE")) [1] "輪" idx - which(cid == 99999) # CIDの99999が示す文字は存在しない print(iconv(rawToChar(as.raw(mx[idx, ])), from = "unicodeFFFE")) [1] "" 文字からCIDを得る ここからファイルaj17-kanji.txtをダウンロードしてカレントディレクトリに置き、以下のコマンドを実行する。 library(tidyverse) tbl - read_delim("aj17-kanji.txt", delim = "\t", comment = "#", col_names = FALSE, progress = FALSE, show_col_types = FALSE) cid0 - tbl[[1]] ucd0 - tbl[[19]] idx - which(nchar(ucd0) == 6) cid - cid0[idx] ucd - ucd0[idx] h1 - as.integer(as.hexmode(substr(ucd, 3, 4))) h2 - as.integer(as.hexmode(substr(ucd, 5, 6))) mx - matrix(c(h1, h2), ncol = 2) s - character(nrow(mx)) for (i in 1 nrow(mx)) { + s[i] - iconv(rawToChar(as.raw(mx[i, ])), from = "unicodeFFFE") + } 上記は処理を簡単にするため、Unicodeが16進数表記で「U+」を除く4桁の文字のみ取り出している。文字を指定して、CIDを取り出してみる。最後の例のとおり、該当する文字がない場合は数値のNULLが返る。 idx - which(s == "江") # CIDの2000が示す文字は「江」 print(cid[idx]) [1] 2000 idx - which(s == "輪") # CIDの4000が示す文字は「輪」 print(cid[idx]) [1] 4000 idx - which(s == "𩸽") # サロゲートペアの文字は本整理では対象外 print(cid[idx]) numeric(0) 連番による連続した文字列を作成する 数値型ベクトルで連番を作成し、それをsprintf関数で加工して文字列に変換すればよい。連番は、1,2,3,…と001,002,003,…のような2種類があるが、sprintf関数で指定する書式文字列をうまく利用すれば、どちらも簡単に作ることができる。cat関数を使えば、ファイルに簡単に出力できる。 n - 1 3 sprintf("%d", n) [1] "1" "2" "3" sprintf("%04d", n) [1] "0001" "0002" "0003" s - sprintf("file%04d.jpg", n) print(s) [1] "file0001.jpg" "file0002.jpg" "file0003.jpg" cat(s, file = "temp.csv", sep = "\n") temp.csvの中身 file0001.jpg file0002.jpg file0003.jpg 絶対パスを表す文字列からファイル名(ディレクトリ名)だけを取り出す gsub関数を使う。以下はWindows環境下における絶対パス(区切り記号は「¥」)から、ファイル名とそれ以外のディレクトリ名をそれぞれ取り出した例。 s - c("C \\マクロス\\Δ\\カナメ.バッカニア.txt") gsub("^.+\\\\", "", s) [1] "カナメ.バッカニア.txt" gsub("\\\\[^\\]+$", "", s) [1] "C \\マクロス\\Δ" ランダムに作成された文字列を得る sample関数とpaste関数を組み合わせて使う。sample関数の第2引数に、得たい文字列の長さを指定する。 定数LETTERSとlettersにはそれぞれ英大文字と英小文字を含むベクトルのため、これらをそのまま利用すれば英大小文字だけからなるランダムな文字列を作成することができる。当然、記号を適当に含めれば、それらの文字列からなる任意の文字列を作成することができる。 LETTERS [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z" letters [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z" s - LETTERS paste(sample(s, 14, replace = TRUE), collapse = "") [1] "UJTMRBBANJHZHR" paste(sample(s, 14, replace = TRUE), collapse = "") [1] "PWYFPVJQHJGSNI" s - c(LETTERS, letters) paste(sample(s, 14, replace = TRUE), collapse = "") [1] "QjrFTEySFGwOEG" paste(sample(s, 14, replace = TRUE), collapse = "") [1] "SNRBuCpZdkqpIs" s - c(LETTERS, letters, "#", "$", "%", " ") paste(sample(s, 24, replace = TRUE), collapse = "") [1] "bEimcMQlAHCdRkc%m#GbfifS" paste(sample(s, 24, replace = TRUE), collapse = "") [1] "CVrUHSYWWRPwcrsXF StkSrK" ランダムに作成された文字列を得る stringiパッケージのstri_rand_strings関数を使う。一度に複数個をベクトルで得ることができる。 library(stringi) stri_rand_strings(1, 14) [1] "cJBFBNlLVvbqLQ" s - stri_rand_strings(3, 14) library(stringi) stri_rand_strings(1, 14) [1] "NJNxejqJl3dgYS" s - stri_rand_strings(3, 10) print(s) [1] "5Y4del2QiL" "9JK3rYewTL" "4IXEI2ADaN" ヘルプには、文字列の作成に使用される文字についての説明がある。 ?stri_rand_strings Usage stri_rand_strings(n, length, pattern = "[A-Za-z0-9]") 正規表現の書式を模した書式により、使用される文字列の指定ができる。デフォルトでは英大文字、英小文字、英数字だけだが、例えば、#、$、%、&の記号を4つ追加する場合は、以下のように指定をすればよい。$と&は書式を示す文字のため、前に¥を付けなければならないが、¥はエスケープシーケンスを表す記号でもあるため、前に「¥¥」と2つ続けて入力している。 stri_rand_strings(3, 14, pattern = "[a-z#\\$%\\ ]") [1] "yapn%u$iaguxyj" "#fnkunslor blp" "v nro mvxvpjke" 文字列はRの乱数の規則に則って作成される。そのため、乱数の種をset.seed関数で指定すると、作成される文字列を再現することができる。 stri_rand_strings(4, 6) [1] "O45lLP" "L0uBiZ" "XMpBOU" "UNdLx2" set.seed(6) stri_rand_strings(4, 6) [1] "bwGNoy" "xlV3du" "5IlFWg" "9hxp7E" stri_rand_strings(4, 6) [1] "kJMuHQ" "W7xl8v" "N3zlhi" "4wyp7Q" set.seed(6) stri_rand_strings(4, 6) [1] "bwGNoy" "xlV3du" "5IlFWg" "9hxp7E" stri_rand_strings(4, 6) [1] "kJMuHQ" "W7xl8v" "N3zlhi" "4wyp7Q" ランダムに作成された文字列を得る runif関数とpaste関数を組み合わせて使う。chベクトルには文字列にランダムで割り振る文字を指定し、lenベクトルには得たい文字列の長さを1つだけ指定する。ただし、この方法では一度に一つの文字列しか得ることはできない。 定数LETTERSとlettersにはそれぞれ英大文字と英小文字を含むベクトルのため、これらをそのまま利用すれば英大小文字だけからなるランダムな文字列を作成することができる。当然、記号を適当に含めれば、それらの文字列からなる任意の文字列を作成することができる。 len - 10 ch - LETTERS paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "") [1] "WTHNZZCBIJ" paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "") [1] "STATFLICHV" len - 20 ch - c(LETTERS, letters, "#", "$", "%", " ") paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "") [1] "bBYEODy DlSZuKcaaykO" paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "") [1] "hCYaqYkpWkDbP$HcAZPB" 文字列はRの乱数の規則に則って作成される。そのため、乱数の種をset.seed関数で指定すると、作成される文字列を再現することができる。 paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "") [1] "XG#C#CwhHgBWKgyVdblP" set.seed(20) paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "") [1] "xrPd$%FDSUoqApKZSGQt" paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "") [1] "bBYEODy DlSZuKcaaykO" set.seed(20) paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "") [1] "xrPd$%FDSUoqApKZSGQt" paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "") [1] "bBYEODy DlSZuKcaaykO" 文字列のハッシュ値を得る opensslパッケージを使う。以下はハッシュ関数MD5、SHA-1、SHA-256でそれぞれハッシュ値を得た例。 s - c("セナディア", "鈴木みのり", "イレイナ", "本渡楓") openssl md5(s) [1] "b17b3d97c7f19375d1989eaa6d5d7f19" [2] "2cdcdf384125ac19c173e9517b23847b" [3] "df7909633e9e58c8fc61f7ddaa996264" [4] "9adf030a3e1852802deadb793c4eab0f" openssl sha1(s) [1] "226dda8c2f33794cdefaef027a43e48135abb6c3" [2] "728d6a009b1700f9759ed2b502a0f673820700d5" [3] "97fceb672478954169751379650c14b12f76d808" [4] "be0a600d132eccfb2ed41a0424189efe210e8dff" openssl sha256(s) [1] "e385677aa0a829d448251e47f3f6cfa4b82951c9df9b53658a29e71cbfb3125d" [2] "4a806bf1e967f0764841aabcb3e634316f4b19be1dc9244480cd2c26c315db2b" [3] "4bd95d8e4a10c946842b256f0b7f281d5db587161a8a5658ae3ab5c19543a222" [4] "443e41893a26ea324275a26f89a48812f7ac0b687bebf0baddadcd0996116405" digestパッケージのdigest関数でも得ることができるが、こちらは文字列を文字列型ベクトルで与えることができないため、最初の要素しか使用されない。 digest digest(s, algo = "md5", serialize = FALSE) [1] "b17b3d97c7f19375d1989eaa6d5d7f19" digest digest(s, algo = "sha1", serialize = FALSE) [1] "226dda8c2f33794cdefaef027a43e48135abb6c3" digest digest(s, algo = "sha256", serialize = FALSE) [1] "e385677aa0a829d448251e47f3f6cfa4b82951c9df9b53658a29e71cbfb3125d" digest digest("セナディア", algo = "sha256", serialize = FALSE) [1] "e385677aa0a829d448251e47f3f6cfa4b82951c9df9b53658a29e71cbfb3125d"
https://w.atwiki.jp/wolfrpgu/pages/40.html
文字列操作
https://w.atwiki.jp/muniosan/pages/5.html
標準で使用できないため、可変引数を用いた自作snprintf pStrは終端+1まで進めてから書き込むため、複数回呼び出すとpStrに文字列が連結していきます。 書き込み後、pStrのアドレス値は元に戻すため、そのままfwrite等で使用できます。 /*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ /* <関数説明> */ /* snprintfエミュレート関数 */ /* */ /* <引数説明> */ /* pStr :[I/O]文字列バッファ */ /* format :[I]printf形式フォーマット */ /* ... :[I]可変引数 */ /* */ /* <戻り値> */ /* なし */ /*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ #include stdio.h void tst_snprintf( char *pStr, char *format, ... ) { va_list arg; va_start(arg, format); pStr += strlen(pStr); vsprintf(pStr, format, arg); pStr -= strlen(pStr); va_end(arg); }
https://w.atwiki.jp/shouchan/pages/17.html
ほとんどの接続文字列有り http //www.connectionstrings.com/
https://w.atwiki.jp/mopsprogramming/pages/66.html
抽象論 Forth一般では、文字列変数にはバイトアレイを利用するのが普通です。これは、大域変数としてあらかじめ必要なメモリー領域を確保しておくものです。これに対してMopsにはヒープを利用するハイレベルの文字列オブジェクトが準備されています。ここでは、Mops特有(Forth規格にはないという意味)の文字列オブジェクトの基本構造の説明を試みます。PowerMopsを前提とします。 文字列クラスには、二つのクラスが準備されています。一つはStringクラスで、これはMopsにはじめからロードされています。もう一つはその下位クラスのString+クラスで、zString+ファイル(iMopsではString+)をロードすれば利用可能となります。クラス階層は、 String = ByteString = String+ となっていますが、かなりの数のメソッドが上書き(オーバーライド)されています。 クラス階層を頭から書き出せば、 Object = LongWord = Handle = String ..... となります。LongWordクラスは4バイトの数値を格納するデータクラスの基礎を提供しているクラスです(ジェネリッククラス)。Stringクラスはまたhandleクラスの下位クラスです。これはつまり、Stringオブジェクトの文字列データは、伸縮自在であるということをも意味します。大雑把にいえば、Stringクラスは文字列データを自由利用メモリ(ヒープメモリ)に適当な領域を取って格納し、必要なときにその場所にアクセスできるための4バイトデータ(マスターポインタ)だけをオブジェクトデータとして保有することになります。 Stringオブジェクトは宣言によって生成されます: STRING MyString STRING+ MyString+ この段階では、もちろんまだ中身はありません。 関連項目: 文字列定数 Stringクラスの基本メソッド Stringの諸データとアクティブ部分 文字列を操作する 文字列の廃棄 トップページへ 目次へ
https://w.atwiki.jp/mopsprogramming/pages/70.html
格納文字列の廃棄 格納された文字列をもう使わないのであれば、それにメモリを占拠させておくのは無駄です。RELEASE メッセージを送ると、文字列は廃棄され、確保されていたメモリ領域は完全に解放されます。 RELEASE MyString \ RELEASE ( -- ) ただ、細かいことですが、Stringオブジェクトは、文字列データ以外にもサイズやアクティブ部分を示すオフセットの値といったデータ(インスタンス変数)を持っています。RELEASE メソッドは、これら全てを初期化してくれるわけではありません。もっとも、そのままにしておいても、次に内容を格納したときには、全てが適切な値にセットされるようになっています。 付随的なデータも初期化したいときには、CLEAR メソッドがあります。このメソッドは、マスターポインタ自体は保持しますが、随伴するヒープ領域の大きさは0にセットします。これは結果として、残りのデータを全て初期化することになります。 CLEAR MyString \ CLEAR ( -- ) マスターポインタの分(PPC G3,G4では4バイト)はシステムの側が領域を確保してくれます。特に個数が多くないのであれば、このままでも大きなロスではありません。気になる場合は、重ねてRELEASE すればよいことになります。こうすれば、オブジェクトデータ以外の部分は完全に解放されるとともに、Stringオブジェクトのインスタンス変数も完全に初期化されます。 なお、PUT メソッドを用いて文字列オブジェクトの内容を新たに代入すると、それ以前に格納されていた文字列は自動的にRELEASE されます。したがって、新たにPUT する場合には事前に廃棄操作をする必要はありません。 関連項目: 文字列オブジェクト Stringクラスの基本メソッド Stringの諸データとアクティブ部分 文字列を操作する トップページへ 目次へ
https://w.atwiki.jp/fieds_labo3/pages/22.html
クラスライブラリ 文字列 基本ライブラリ-言語とユーティリティのパッケージ:java.lang 1.Stringクラス リテラリなど可変文字列。内容変更不可。 オブジェクト生成:String str = "Hey!"; 主なメソッド char charAt(int index) :引数位置にある文字を返す boolean endsWith(String suffix) :引数文字列で終わるかどうかを判断 boolean equals(Object anObject) :引数文字列かどうかを判断 boolean equalsIgnoreCase(String anotherString) :引数文字列かどうかを大文字・小文字の区別なしに判断 int indexOf(int ch) :引数文字が最初に出現する位置を返す int indexOf(String str) :引数文字列が最初に出現する位置を返す int lastIndexOf(int ch) :引数文字が最後に出現する位置を返す int lastIndexOf(String str) :引数文字列が最後に出現する位置を返す int length() :文字列の長さを返す String substring(int beginIndex) :引数位置から最後までの部分文字列を返す String substring(int beginIndex, int endIndex) :引数開始位置から終了位置までの部分文字列を返す boolean startsWith(String prefix) :引数文字列で始まるかどうかを判断 String toLowerCase() :文字列を小文字に変換して返す String toUpperCase() :文字列を大文字に変換して返す 2.StringBufferクラス 文字列の内容変更可能。 主なメソッド StringBuffer append(char c) :引数文字を追加 StringBuffer append(String str) :引数文字列を追加 StringBuffer deleteCharAt(int index) :引数位置の文字を削除 StringBuffer insert(int offset, char c) :引数位置に文字を追加 StringBuffer insert(int offset, String str) :引数位置に文字列を追加 int length() :文字数を返す StringBuffer replace(int start, int end, String str) :引数位置の文字列を引数文字列で置換 StringBuffer reverse() :文字順を逆にする void setCharAt(int index, char ch) :引数位置の文字を引数文字にする String toString() :Stringクラスオブジェクトに変換
https://w.atwiki.jp/rffbl22/pages/29.html
文字列の結合 Fortranでの文字列の結合は、//(スラッシュ2回)で実現できる。 foobar = hoge // hige とすると変数foobarには、hogehigeという文字列が入る。 変数の型は自動で変わらないので、整数の値を文字列として結合する場合には あらかじめ型変換をしておく。 fortranプログラム例(抜粋) filename = amedas0350.txt output= "AMeDAS" // filename(7 10) // ".txt" amedas0350.txtのうち7~10文字目を取って、outputとして、AMeDAS0350.txtを指定する。
https://w.atwiki.jp/frostar/pages/34.html
string.hをincludeする必要がある。 mem系 memcpy メモリコピー memmove メモリ移動 memset メモリセット str系 strcpy 文字列コピー strcat 文字列結合 strlen 文字列長さ取得 strcmp 文字列比較 strstr 文字列検索 strtok 文字列分割
https://w.atwiki.jp/newsmj/pages/35.html
全角文字列 ゴージャスな和了で皆を魅了する人気者。 確実なオリも上流ならではだが、 必要以上にリーチを怖がって損をする場面も。 目指すべきは放銃率↓より和了率↑か。 ※ミソジーズ4号