このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1289913298/570
#  [1] 授業単元:C言語 
#  [2] 問題文(含コード&リンク): 
#  file1.csv(マスタファイル)からデータを読み込みfile2.csv(トランザクションファイル)に記述された内容でデータを更新・追加し、 
#  再度file1.csvに保存せよ。 
#   
#  file1.csv 
#  1,Ken Kawakami,kawakami@xxxxx.xx.jp 
#  2,Toshiyuki Ishikura,ishikura@xxxxx.xx.jp 
#  3,Yuuta Hayashi,yutahaya@xxxxx.xx.jp 
#  4,Kazuwo Inoue,inoue@xxxxx.xx.jp 
#  5,Kinya Nagata,osada@xxxxx.xx.jp 
#  6,Yuki Hayashi,yukihaya@xxxxx.xx.jp 
#  7,Yoshiyuki Hihara,hihara@xxx.xx.jp 
#   
#  file2.csv 
#  2,,isikura@xxx.xx.xx.jp 
#  4,Kazuo Inoue, 
#  5,,nagata@xxxxx.xx.jp 
#  7,Yoshiyuki Hinohara,hinohara@xxx.xx.jp 
#  8,Kouki Takahashi,takahashi@xxxxx.xx.jp 
#  9,airi Saito,saito@xxx.xx.xx.jp 
#   

'file1.csv(マスタファイル)からデータを読み込みfile2.csv(トランザクションファイル)に記述された内容でデータを更新・追加し、再度file1.csvに保存せよ。' :-
        'file1.csv(マスタファイル)からデータを読み込み'(LL1),
        'file2.csv(トランザクションファイル)に記述された'(LL2),
        '内容でデータを更新・追加し、'(LL2,LL1,LL3),
        '再度file1.csvに保存する'(LL3).

'file1.csv(マスタファイル)からデータを読み込み'(LL1) :-
        get_split_lines('file1.csv',[','],LL1).

'file2.csv(トランザクションファイル)に記述された内容で'(LL2) :-
        get_split_lines('file2.csv',[','],LL2).

'内容でデータを更新・追加し、'([],LL,LL) :- !.
'内容でデータを更新・追加し、'([[N|R02]|R2],LL1,LL) :-
        トランザクションの行指定と合致する行を更新する(N,R02,LL1,LL3),
        '内容でデータを更新・追加し、'(R2,LL3,LL),!.
'内容でデータを更新・追加し、'([[N|R02]|R2],LL1,LL) :-
        トランザクションの行指定に合致しないがより小さい行とより大きい行があるためその間に挿入する(N,R02,LL1,LL3),
        '内容でデータを更新・追加し、'(R2,LL3,LL),!.
'内容でデータを更新・追加し、'([[N|R02]|R2],LL1,LL) :-
        トランザクションの行指定より小さい行がないため先頭に挿入する(N,R02,LL1,LL3),
        append([[N|R02]],LL1,LL3),
        '内容でデータを更新・追加し、'(R2,LL3,LL),!.
'内容でデータを更新・追加し、'([[N|R02]|R2],LL1,LL) :-
        トランザクションの行指定が現在の最大行を越えているため末尾に挿入する(N,R02,LL1,LL3),
        '内容でデータを更新・追加し、'(R2,LL3,LL),!.

トランザクションの行指定と合致する行を更新する(N,R02,LL1,LL3) :-
        append(L0,[[N|R01]|R1],LL1),
        append(L0,[[N|R02]|R1],LL3),!.

トランザクションの行指定に合致しないがより小さい行とより大きい行があるためその間に挿入する(N,LL1,LL3) :-
        append(L0,[[N1|R01]|R1],LL1),
        N1 > N,
        max(L0,M),
        M < N,
        append(LL0,[[N|R02]|R1],LL3),!.

トランザクションの行指定より小さい行がないため先頭に挿入する(N,R02,LL1,LL3) :-
        append([],[[N1|R01]|R1],LL1),
        N1 > N,
        append([[N|R02]],LL1,LL3),!.

トランザクションの行指定が現在の最大行を越えているため末尾に挿入する(N,R02,LL1,LL3) :-
        \+((append(L0,[[N1|R01]|R1],LL1),N1 > N)),
        append(LL1,[[N|R02]],LL3),!.

'再度file1.csvに保存する'(LL3) :-
        findall(S,(
                    append(_,[L|_],LL3),
                    concat_atom(L,',',S)),
                LL4),
        open('file1.csv',write,Outstram),
        append(_,[Line|R],LL4),
        write_formatted(Outstream,'%t\n',[Line]),
        R = [],
        close(Outstream),!.