このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1328276597/557
#  初めて書き込みます。よろしくお願い致します。固定長バイトの文字列の中の一部を抜き出すところがわかりませんでした。 
#  1] 授業単元:C言語 
#  [2] 問題文(含コード&リンク): 
#  文字列A(固定長150バイト)一万行以上と文字列B(CSV)一万行以上の
#  それぞれのテキストデータ・ファイルがある。
#  文字列A の5文字目から6文字分と文字列Bの2カラム目の4文字目から6文字分を
#  比較し、
#  同じなら、文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を
#  置き換える。
#  文字列Bの4カラム目が50バイト以下なら " "空白で埋める。
#  50バイトより大きい場合50バイトまでの大きさを対象とする。 
#  
#  置き換え対象領域は日本語全角漢字含む文字列となる。 
#  文字列Aの対象領域は2バイトx20文字+1バイト10文字で整形されている。 
#  文字列AはSolaris10上のファイル。文字列BはエクセルファイルをCSV保存してFFFTPでSolaris10へコピーしたもの。 
#  文字コード:文字列A(EUC-JP)、文字列B(sjis2eucで変換) 
#  
#  1ー77バイトが1バイト、77ー126が変換対象。126ー150が1バイトです。

'文字列A(固定長150バイト)一万行以上と文字列B(CSV)一万行以上のそれぞれのテキストデータ・ファイルがある。' :-
        get_lines('文字列A',Lines1),
        get_lines('文字列B',Lines2),
        '文字列Aの全行を置換する'(Lines1,Lines2,Lines3),
        'Lines3を文字列Aに書き戻す'(Lines3,_文字列A),!.

'文字列Aの全行を置換する'([],_,[]) :- !.
'文字列Aの全行を置換する'([_文字列A|R1],Lines2,[_置換した文字列|R3]) :-
        'Lines2を検索して文字列Aを置換する'(_文字列A,Lines2,_置換した文字列),
        '文字列Aの全行を置換する'(R1,Lines2,R3).

'Lines2を検索して文字列Aを置換する'(_文字列A,[],_文字列A) :- !.
'Lines2を検索して文字列Aを置換する'(_文字列A,[_文字列B|R2],_置換した文字列) :-
        '文字列Aを一行の置換'(_文字列A,_文字列B,_置換した文字列),!.
'Lines2を検索して文字列Aを置換する'(_文字列A,[_|R2],_置換した文字列) :-
        'Lines2を検索して文字列Aを置換する'(_文字列A,R2,_置換した文字列),!.

'文字列Aを一行の置換'(_文字列A,_文字列B,_置換した文字列) :-
        split(_文字列B,[' ',','],L),
        '文字列A の5文字目から6文字分と文字列Bの2カラム目の4文字目から6文字分を比較し同じなら'(_文字列A,L),
        '文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を置き換える'(_文字列A,L,_置換された文字列).

'文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を置き換える'(_文字列A,L,_置換された文字列) :-
        sub_byte_atom(_文字列A,0,76,_,S1),
        sub_byte_atom(_文字列A,126,_,0,S3),
        '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2),
        concat_atom([S1,S2,S3],_置換された文字列),!.      

'文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2) :-
        '文字列Bの4カラム目が'(L,S2_1),
        '50バイト以下なら'(S2_1),
        '" "空白で埋める'(S2_1,S2),!.
'文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2) :-
        nth1(4,L,S_1),
        sub_byte_atom(S_1,0,50,_,S2).

'文字列Bの4カラム目が50バイト以下なら'(L) :-
        nth1(4,L,S_1),
        atom_byte_length(S_1,_長さ),
        _長さ =< 50,!.

'" "空白で埋める'(S2_1,S2) :-
        length(L2,50),
        atom_byte_codes(S2_1,L_1),
        append(L_1,_,L2),
        変数を空白に置換(L2),
        atom_byte_codes(S2,L2),!.

変数を空白に置換([]).
変数を空白に置換([' '|R]) :-
        変数を空白に置換(R),!.
変数を空白に置換([A|R]) :-
        変数を空白に置換(R).

'Lines3を文字列Aに書き戻す'(Lines3) :-
        put_lines('文字列A',Lines3).

atom_byte_codes(Atom,ByteCodes) :-
        atom(Atom),
        atom_codes(Atom,Codes),
        バイトに分解(Codes,ByteCodes),!.
atom_byte_codes(Atom,ByteCodes) :-
        \+(atom(Atom)),
        'ByteCodes2Codes'(ByteCodes,Codes),
        atom_codes(Atom,Codes),!.

'ByteCodes2Codes'([],[]).
'ByteCodes2Codes'([A,B|R1],[C|R2]) :-
        A > 127,
        B > 127,
        C is 256 * A + B,
        'ByteCodes2Codes'(R1,R2),!.
'ByteCodes2Codes'(R1,R2) :-
        'ByteCodes2Codes'(R1,R2),!.

atom_byte_length(Atom,ByteLength) :-
        atom_codes(_文字列,Codes),
        バイトに分解(Codes,ByteCodes),
        length(ByteCodes).

atom_byte_codes(Atom,ByteCodes) :-
        atom_codes(Atom,Codes),
        バイトに分解(Code,ByteCodes).

sub_byte_atom(_文字列,_スタートバイト位置,_バイト数,_残りバイト,_副文字列) :-
        atom_codes(_文字列,Codes),
        バイトに分解(Codes,ByteCodes),
        sub_byte_list(ByteCodes,_スタートバイト位置,_バイト数,_残りバイト,SubList),
        atom_code(_副文字列,SubList).

sub_byte_list(ByteCodes,_スタートバイト位置,_バイト数,_残りバイト,SubList) :-
        length(L0,_スタートバイト位置),
        length(L1,_バイト数),
        append(L0,SubList,L2,ByteCodes),
        length(L2,_残りバイト),!.

バイトに分解([],[]).
バイトに分解([A|R1],[B,C|R2]) :-
        A > 255,
        B is A // 256,
        C is A mod 256,
        バイトに分解(R1,R2),!.
バイトに分解([A|R1],[A|R2]) :-
       バイトに分解(R1,R2).