MiniSplit::FileSplit - File Splitter Module
use MiniSplit::FileSplit; $fs = new MiniSplit::FileSplit;
# キーワードは含まず、大文字小文字の区別をする $fs->set_props(KEYWORD_INC => 0, CASE_SENSITIVE => 1);
# 対象ファイルを ./text.txt に設定 $fs->set_file_name("./test.txt");
# 抽出開始位置と終了位置の文字列を設定 # 終了位置の指定のように、正規表現の指定も可能。 # "\n?" などを指定しているのは、切り出した結果を制御するため。 # 切り出しの指定通りの位置まで開始位置や終了位置と見做すので、 # 改行を含めたい場合などは、このように指定する。 $fs->set_split_text("--- 抽出開始 ---\n", "---[ \t]*抽出終了[ \t]*---\n?");
# 抽出処理(可変文字列の展開あり) $text = $fs->get_file_part(var1 => "可変文字列1", var2 => "可変文字列2");
MiniSplit::FileSplit クラスは、Perl 5 向けのモジュールで、
・ファイルから特定の部分を抽出
・抽出した中に含まれる可変文字列部分を変換
という機能を提供します(以降、MiniSplit::FileSplit は FileSplit と省略)。
抽出の開始位置と終了位置は、FileSplit の利用者側で任意の文字列を指定します。
また、可変文字列については、ファイル中で、
・${hogehoge}
という形式で指定しておき、FileSplit での抽出時にその可変文字列を置き換える文字列を指定します。
例えば、
aaa --- Sep-S --- bbb This is variable -> ${var} ccc ddd --- Sep-E --- eee
というファイル test.txt から、bbb 〜 ddd 間を取り出し、その中の ${var} を特定の内容に置き換えるということが出来ます。
その場合には、FileSplit に対して、
$fs = new MiniSplit::FileSplit;
# 動作設定 $fs->set_props(KEYWORD_INC => 0); $fs->set_file_name("./test.txt"); $fs->set_split_text("--- Sep-S ---", "--- Sep-E *---\n?");
# 抽出&出力 $text = $fs->get_file_part(var => "可変文字列" ); print $text;
とすると、test.txt から
bbb This is variable -> 可変文字列 ccc ddd
という内容を取得できます。
可変文字列は、別の名称/同じ名称のどちらでも複数箇所に埋め込むことが可能です。同じものを複数箇所に埋め込んだ場合には、同じ値でそれらが展開されます。
展開を抑止したい箇所には \${hogehoge} とテキスト中で、\ を抑止したい箇所の前に指定します。 より詳細の制御は次のように行ないます。
${hogehoge} -> 展開 \${hogehoge} -> 抑止 \\${hogehoge} -> \ + 展開 (\\ は \ として扱う) \\\${hogehoge} -> \ + 抑止 (最初の \\ は \, 次の \ は抑止指定とみなす)
※$ と絡まない \ は1文字で \ とする。
FileSplit は、次のようなメソッドがあります。
FileSplit の新しいオブジェクトを作成します。
引数として、set_props() 関数と同じ内容を渡し、動作設定をすることが可能です。
FileSplit の動作の詳細設定を行なうサブルーチンです。
設定できる項目は、
・CASE_SENSITIVE 切り出しのキーワードで大文字/小文字を区別するかの真偽値。 初期値: 真(区別する)
・KEYWORD_INC 抽出時キーワード部分を含む/含まないの真偽値。 初期値: 真(含む)
・INPUT_CODE 入力ファイルの文字コード系。 'euc','sjis','jis' のいずれかを指定可能(jcode.pl に依存)。 初期値: 自動判定 (内部処理用に euc に変換する) 特に、sjis の場合には、明示的に指定することを推奨。
・OUTPUT_CODE 出力テキストの文字コード系。 'euc','sjis','jis' のいずれかを指定可能(jcode.pl に依存)。 初期値: euc
・INPUT_CONV_OPT 入力ファイルの文字コード変換用オプション。 変換時に jcode.pl に渡したいオプションがあれば指定。 初期値:なし
・OUTPUT_CONV_OPT (出力テキストの文字コード変換用オプション jcode.pl用) 出力テキストの文字コード変換用オプション。 変換時に jcode.pl に渡したいオプションがあれば指定。 初期値:なし
※コード変換時、改行コードはそのままです。
が指定可能です。
引数には、設定する名称と値を、キーと値のペアとして設定したハッシュの変数を渡すか、
%param = (CASE_SENSITIVE => 1, KEYWORD_INC => 1); %param = (CASE_SENSITIVE => 1);
あるいは、呼び出し時に直接、
$fs->param(CASE_SENSITIVE => 1, KEYWORD_INC => 1); $fs->param(CASE_SENSITIVE => 1);
として値を渡して下さい。
FileSplit の動作の詳細設定値を取得するサブルーチンです。
set_props で設定出来るパラメータについて、ハッシュ値で返します。
%param = $fs->get_props(); if($param{CASE_SENSITIVE}){
といった形で値を取得して参照して下さい。
get_file_part 関数でファイルを抽出する際の抽出開始〜終了位置を示す文字列を指定します。
復帰値で、設定されている内容を (開始文字列, 終了文字列) の配列で返します。
次のように利用して下さい。
$fs->set_split_text("開始", "終了"); @split_point = ("開始", "終了"); $fs->set_split_text(@split_point);
もしも、FileSplit を new して後に未設定のまま、あるいは次のように
$fs->set_split_text("", "終了"); $fs->set_split_text("開始", undef);
といったように、空文字列/未定義値を渡すと、
・開始位置の場合にはファイル先頭から ・終了位置の場合にはファイル末尾まで
と扱います。
ファイルを抽出する際の抽出開始〜終了位置を示す文字列として、現在設定されている値を取得します。
復帰値で、設定されている内容を (開始文字列, 終了文字列) の配列で返します。
@split_point = $fs->get_split_text();
FileSplit の操作対象とするファイル名を設定します。
$fs->set_file_name("./splitfile.txt");
復帰値で、成功した場合には真値、ファイルのオープンが出来ない等の場合には偽値を返します。
注意点は次の通り。
・この関数で設定したファイルが、get_file_part() メソッドの操作 対象となります。
・複数回呼び出すと、最後の設定値が有効になります。 そのため、同じ FileSplit のオブジェクトを利用して、複数のファ イルを操作用に再利用することも可能です。
・もし、操作対象とするファイルが euc 以外の場合には内部で処理す るためにeuc に変換します。 初期設定では、jcode.pl の自動判定を利用していますが、問題があ る場合等には、set_props() メソッドで明示的に入力コード等を指定 して下さい。
・ファイル名が不正/open 不可の場合には、エラー(偽で復帰)とな るので注意すること。
・現状のロジックは、この時点でファイル全体をメモリ上に展開してい るので、巨大なファイルの場合には、問題が発生する可能性がありま す。 (コンパクトなファイルを対象として、速度優先で抽出したかったの で)
FileSplit
の操作対象として設定されているファイル名を通知します。
$filename = $fs->get_file_name();
FileSplit の操作対象として設定されているから、指定部分の抽出を行ないます。
復帰値で、抽出したテキストを返します。 もし、対応する抽出箇所が無いなどの場合には、空文字列で復帰します。
その際に、ファイル中に含まれる可変文字列として変換するものの名前と値を、ハッシュ値で渡して下さい。 可変文字列の展開が必要ない場合には、引数を一切指定せずに呼び出して下さい。
テキストは、初期設定では euc コードで出力します。 もしも、出力コードを変更したい場合等は、set_props() メソッドで明示的に入力コード等を指定して下さい。
詳しい説明については、最初の DESCRIPTION を参照して下さい。
Rab-Duck, rabduck@infoseek.jp