R(テキストファイルの入出力)

2026年2月16日 (月)

[R]文字列型ベクトルの文字列を簡単にテキストファイルに高速で書き込む

標準で搭載されているwrite関数やwrite.table関数を使ってもよいが、readrパッケージのwrite_delim関数、data.tableパッケージのfwrite関数を使うと、書き込む速度が断然速いため、こちらの使用を推奨する。ただし、デフォルトの動作やオプションの指定が関数によって異なるので注意。

以下は、write関数、write.table関数、write_delim関数、fwrite関数でそれぞれ文字型ベクトルの中身をファイルtemp.txtに書き込んだ例。最初に1回書き出した後に、それぞれ2回ずつ、書き込みに要した時間をsystem.time関数で計測している。Windows環境で文字符号化方式はUTF-8で行っている。UTF-8では漢字は一文字当たり3バイト。改行コードはCR+LFで、100万行出力しているため、ファイルサイズが(16×3+2)×10^6=50,000,000バイト≒47.7MBのファイルを出力している。

> .Platform$OS.type
[1] "windows"
> Sys.getlocale("LC_CTYPE")
[1] "Japanese_Japan.utf8"
> library(data.table)
> library(tidyverse)
> tempfile <- "temp.txt"
> s <- "アストラ役の遠藤綾さん、かわいい"
> s <- c(s, "ヴィタ役の日笠陽子さん、かわいい")
> s <- c(s, "松雀役の高森奈津美さん、かわいい")
> s <- c(s, "リフ役の瀬戸麻沙美さん、かわいい")
> nchar(s)
[1] 16 16 16 16
> ss <- sample(s, 10 ^ 6, replace = TRUE)
> length(ss)
[1] 1000000
> head(ss)
[1] "リフ役の瀬戸麻沙美さん、かわいい" "松雀役の高森奈津美さん、かわいい"
[3] "アストラ役の遠藤綾さん、かわいい" "松雀役の高森奈津美さん、かわいい"
[5] "リフ役の瀬戸麻沙美さん、かわいい" "リフ役の瀬戸麻沙美さん、かわいい"

data.tableパッケージのfwrite関数を使用した例。書き込む文字列をベクトルで与えることはできないため、データフレームに変換して引数に与えている。

> dtf <- data.frame(ss)
> fwrite(dtf, tempfile, col.names = FALSE, showProgress = FALSE)
> sprintf("%d", file.info(tempfile)$size)
[1] "50000000"
> system.time(
+ fwrite(dtf, tempfile, col.names = FALSE, showProgress = FALSE)
+ )
ユーザ システム 経過
0.04 0.02 0.03
> system.time(
+ fwrite(dtf, tempfile, col.names = FALSE, showProgress = FALSE)
+ )
ユーザ システム 経過
0.05 0.05 0.05

readrパッケージのwrite_delim関数を使用した例。同様にベクトルを扱えないため、データフレームに変換して引数に与えている。

> dtf <- data.frame(ss)
> write_delim(dtf, tempfile, col_names = FALSE, progress = FALSE, eol = "\r\n")
> sprintf("%d", file.info(tempfile)$size)
[1] "50000000"
> system.time(
+ write_delim(dtf, tempfile, col_names = FALSE, progress = FALSE, eol = "\r\n")
+ )
ユーザ システム 経過
0.24 0.21 0.19
> system.time(
+ write_delim(dtf, tempfile, col_names = FALSE, progress = FALSE, eol = "\r\n")
+ )
ユーザ システム 経過
0.36 0.36 0.14

write_table関数を使用した例。

> write.table(ss, tempfile, row.names = FALSE, col.names = FALSE, quote = FALSE)
> sprintf("%d", file.info(tempfile)$size)
[1] "50000000"
> system.time(
+ write.table(ss, tempfile, row.names = FALSE, col.names = FALSE, quote = FALSE)
+ )
ユーザ システム 経過
1.03 0.06 1.11
> system.time(
+ write.table(ss, tempfile, row.names = FALSE, col.names = FALSE, quote = FALSE)
+ )
ユーザ システム 経過
0.94 0.06 1.03

write関数を使用した例。

> write(ss, tempfile)
> sprintf("%d", file.info(tempfile)$size)
[1] "50000000"
> system.time(
+ write(ss, tempfile)
+ )
ユーザ システム 経過
1.32 3.17 4.58
> system.time(
+ write(ss, tempfile)
+ )
ユーザ システム 経過
1.34 3.32 4.72

2回しか試行していないものの、書き込む速度は、おおよそfwrite関数、write_delim関数、write_table関数、write関数の順に早いことがわかる。

2026年2月15日 (日)

[R]文字列型ベクトルの文字列を文字符号化方式を指定してテキストファイルに書き込む

write関数を使うと、文字型ベクトルの文字列を簡単にテキストファイルに書き出すことができる。出力する文字符号化方式は、文字型ベクトルの指定にiconv関数を使用すればよい。

以下は、それぞれUTF-8とShift_JISで文字型ベクトルの中身をファイルtemp.txtに出力した例。nchar関数の出力どおり、文字数は合計37文字。最初に、この環境のデフォルトのUTF-8で出力する。

> .Platform$OS.type
[1] "windows"
> Sys.getlocale("LC_CTYPE")
[1] "Japanese_Japan.utf8"
> tempfile <- "temp.txt"
> s <- "カンタレラ役の中原麻衣さん、かわいい"
> s <- c(s, "セナディア役の鈴木みのりさん、かわいい")
> nchar(s)
[1] 18 19

書き出したファイルを、バイナリーファイルとしてraw形式で読み込んで文字符号化方式を確認する。UTF-8で「カ」は0xe382ab、「ン」は0xe383b3であり、また日本語は1文字当たり3バイトになり、2行出力したためそれぞれ改行コード(CR+LF)が2バイトずつ追加されるため、37×3+2×2=115バイトになるはず。

> write(s, file = tempfile)
> con <- file(tempfile, "rb")
> size <- file.info(tempfile)$size
> ra <- readBin(con, what = raw(), size)
> close(con)
> print(ra)
[1] e3 82 ab e3 83 b3 e3 82 bf e3 83 ac e3 83 a9 e5 bd b9 e3 81 ae e4 b8 ad
[25] e5 8e 9f e9 ba bb e8 a1 a3 e3 81 95 e3 82 93 e3 80 81 e3 81 8b e3 82 8f
[49] e3 81 84 e3 81 84 0d 0a e3 82 bb e3 83 8a e3 83 87 e3 82 a3 e3 82 a2 e5
[73] bd b9 e3 81 ae e9 88 b4 e6 9c a8 e3 81 bf e3 81 ae e3 82 8a e3 81 95 e3
[97] 82 93 e3 80 81 e3 81 8b e3 82 8f e3 81 84 e3 81 84 0d 0a
> length(ra)
[1] 115

次にShift_JISで出力し、出力したファイルを読み込みんで文字符号化方式を確認する。「カ」は0x834a、「ン」は0x8393であり、日本語は1文字当たり2バイトのため、37×2+2×2=78バイトになるはず。

> write(iconv(s, from = "UTF-8", to = "CP932"), file = tempfile)
> con <- file(tempfile, "rb")
> size <- file.info(tempfile)$size
> ra <- readBin(con, what = raw(), size)
> close(con)
> print(ra)
[1] 83 4a 83 93 83 5e 83 8c 83 89 96 f0 82 cc 92 86 8c b4 96 83 88 df 82 b3
[25] 82 f1 81 41 82 a9 82 ed 82 a2 82 a2 0d 0a 83 5a 83 69 83 66 83 42 83 41
[49] 96 f0 82 cc 97 e9 96 d8 82 dd 82 cc 82 e8 82 b3 82 f1 81 41 82 a9 82 ed
[73] 82 a2 82 a2 0d 0a
> length(ra)
[1] 78

2026年1月27日 (火)

[R]文字列型ベクトルを文字符号化方式を指定してテキストファイルに書き込む

write関数を使う。第二引数にはファイル名を文字列で指定するのではなく、file関数を使ってコネクションを指定する。file関数には文字符号化方式を指定するencodingオプションがあるので、これに文字符号化方式の種類を指定すればよい。ベクトルの中身は一要素一行で出力され、Windows版であれば各行の最後にはCR+LFが必ず付く。

> s <- c("鳴潮", "カンタレラ", "中原麻衣")
> # Shift_JISでファイルに書き出す
> write(s, file("temp.txt", encoding = "SJIS"))
> # UTF-8でファイルに書き出す
> write(s, file("temp.txt", encoding = "UTF-8"))
無料ブログはココログ

■■

■■■