2022年06月08日 - ファイル処理に関するメモ

書いてあることは些細なことですが、久々に使うと忘れていることがあります。

こちらへメモを残しておきます (たまに加筆します)。

  • 対象バージョン: 1.17

read() と動作

  • ファイル全体を一括で文字列 (複数行リテラル) として読み取ります。
  • read() で返されたファイルの内容は文字列形式です (str2list() で変換しない限り配列にはなりません)。
  • ファイルポインタを用意する必要はありません。ファイル名と書き込みたい文字列を用意するだけで手軽に扱えます。
  • すでに同名ファイルがある場合は上書きされます。処理前に対策をしておいてください。
  • 処理対象のファイルがないと Line nnn Error (R35) : Can't create/open the file! になりますのでファイルの所在確認には使えません。

readline() の動作

  • ファイルの先頭から一行ずつ読み取ります (読み取り開始行数の指定は不可能)。また、呼び出されるたびに次の行を読み取ります。
  • read() と str2list() はランダムアクセス向き (配列のインデックスを指定可能) ですが、readline() はシーケンシャルアクセス向きです。
  • 一行ずつ読み取って、何か処理をした後に一行ずつ fputs() で書き出す処理に向いています。
  • ファイルポインタの作成と解放が必要です。

ファイルの行数を得るには

Ring には組み込み関数として用意されていないため、通常は read() と len() を使います。

  1. result = len(read("filename.txt"))
  2. ? result

取得した文字列の改行を削除するには

substr() と組み込み変数 nl (newline) を使います。

  1. result = substr(str, 1, substr(str, nl) - len(nl) )

と書くよりも、

  1. result = substr(str, nl, "")

のほうが明瞭です。

ファイルポインタに関する情報を得るには

通常、使うことはありませんが getpointer(fp) でアドレスを、 len(fp) でポインタのサイズを得られます。

ファイル名をパーセントエンコーディングするには

cURL や wget など外部コマンドと連携するときにマルチバイト文字列を使用したファイル名のエンコードが必要になることがあります。

この処理は weblib (ウェブライブラリ) の URLEncode() メソッドで行います。

  1. load "weblib.ring"
  2. percent_encoder = new System.Web.Application
  3. encoded_filename = percent_encoder.URLEncode("日本語.txt")
  4. ? encoded_filename

注意点としてファイルやパス全体にエンコードを適用するため (一般的なウェブブラウザとの動作とは異なる)、

部分的にエンコードする場合は、事前に切り出しなどの処理が必要です。また、ウェブライブラリではデコード用のメソッドは用意されていません。