実行環境 ファイルの例 Rで、NULL文字をスキップして1行ずつベクトルに入れる ファイル読み込みで失敗した例(ここまで、昨日の「読み込み」編)
Contents


昨日のダミーファイルを作るスクリプト

tmp1 = 'R:/TMP/tmp1.prn'
tmp2 = 'R:/TMP/tmp2.prn'
out1 = 'R:/TMP/all_no_null.prn'
out2 = 'R:/TMP/all.prn'
file.create(out1)
file.create(out2)
for (i in 1:9) {
    str = paste(collapse=' ', rep(i, 10))
    write(str, tmp1)
    writeBin(paste(sep='', str, '\n'), tmp2)
    file.append(out1, tmp1)
    file.append(out2, tmp2)
}
file.remove(c(tmp1, tmp2))

処理を頼まれたテキストファイルの各行末にNULL文字(0x00)があり、Rで読み込むテスト用にダミーファイルを作りました。all.prnNULL文字あり、all_no_null.prnがなし。後者は実際使いませんが比較のため。両方を
example_prn.zipにまとめました。


準備:Rで空ファイルやNULL文字だけのファイルを作る

空ファイルは単純にfile.create関数で、NULL文字だけの方はwriteBin関数で空文字を出力。
# create an empty file
file.create(filename)

# create a file including 0x00 only
writeBin('', filename)

文字列をwriteBin関数で出力するとファイル終端にNULL文字が付くらしいので、前項のスクリプトはこれを使い、1+NULL文字のファイルをfile.append関数で連結してダミーファイルにしました。


できたファイルと、昨日DOSで出力したもの(終端に0x1A)の比較

まずNULL文字のない方は普通のテキストファイル。↓


次にNULL文字のある方は、Mery(エディタ)で開くとダイアログが出て ↓NULLがスペースに変換されます。昨日はDOSで間に合わせ的に作ったので、原因はよく分かりませんが終端に余計な制御文字(EOF、0x1A)が付きました。二つ目の画像のファイル終端が微妙に変なのはそのため。三つ目の画像はRで作り直したもので、ファイル終端が正常です。どちらも昨日のRスクリプトの動作は同じでした。


昨日・今日のファイルをStirling(バイナリエディタ)で開いたところ。改行(LF、0x0A)の次にNULL文字がある点は同じで、ファイル終端だけ違います。


メモ帳では ↓ ファイル終端に0x1Aがあるだけで全体がひどく文字化けしました。それがなければ(二つ目の画像)NULL文字がスキップされるだけ。


ファイル連結をDOSで行う場合

tmp1 = 'R:\\TMP\\tmp1.prn'
tmp2 = 'R:\\TMP\\tmp2.prn'
out1 = 'R:\\TMP\\all_no_null.prn'
out2 = 'R:\\TMP\\all.prn'
file.create(out1)
file.create(out2)
for (i in 1:9) {
    str = paste(collapse=' ', rep(i, 10))
    write(str, tmp1)
    writeBin(paste(sep='', str, '\n'), tmp2)
    system(paste('cmd /c copy /b', out1, '+', tmp1, out1)) # require /b
    system(paste('cmd /c copy /b', out2, '+', tmp2, out2))
}
file.remove(c(tmp1, tmp2))

昨日はRfile.append関数を知らず、DOScopyコマンドで連結しましたが間に合わせ的に行ったのでファイル終端に0x1Aが混入。改めて上記のようにしたら、file.appendを使うのと同じ結果になりました。

なおNULL文字のないテキストだけのファイル連結でも、copyコマンドの/bオプションが必要みたいです。上記で/bを外したら、各ファイルの連結部分で0x1Aが挿入されてました。