このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1349527750/693
#  [1]C/C++プログラミング実習 まとめ  
#  [2]問題 http://ime.nu/codepad.org/CfJninhf 
#    問題文中に出てくる histograms.txt
#  [3]visual studio 2010 
#  [4]11月19日 10時 
#  [5]前にここのスレでお世話になりました../test/read.cgi/tech/1349527750/603です。 
#    この前の課題を提出した所、今度はまとめとして前の問題の発展問題がだされました。 
#    前に頂いたプログラムを改変してみようと思ったのですが、今回の問題が複雑になりすぎてて 
#    お手上げ状態です。どなたか助けていただけると幸いに思います。 
# 
#  /*
#  histograms.txtという文章ファイルがある。
#  このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が
#  並んでいて、それらの数字は水平TAB文字によって区切られている。
#  このhistograms.txtを自動的に以下の条件のもとに改変して
#  train.datというファイルとして出力をするプログラムを作れ。
#  
#  条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。
#      (例 image/0-21C5N550AVL.jpg → 0
#         image/1-19690369.jpg  → 1
#         image/2-24891960.jpg  → 2
#         image/3-12725422.jpg  → 3)
#  
#  条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。
#  
#  条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、
#      番号:数値?番号:数値?番号:数値?…という形に書き換える
#      (例 0 	0.0309051	0	0   0.00496689 
#       → 2:0.0309051 5:0.00496689 …… )
#  
#  条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き
#               指定した方の名前で出力を行う。
#  
#  */

'histograms.txtという文章ファイルがある。
このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が
並んでいて、それらの数字は水平TAB文字によって区切られている。
このhistograms.txtを自動的に以下の条件のもとに改変して
train.datというファイルとして出力をするプログラムを作れ。

条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。
    (例 image/0-21C5N550AVL.jpg → 0
       image/1-19690369.jpg  → 1
       image/2-24891960.jpg  → 2
       image/3-12725422.jpg  → 3)

条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。

条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、
    番号:数値?番号:数値?番号:数値?…という形に書き換える
    (例 0 	0.0309051	0	0   0.00496689 
     → 2:0.0309051 5:0.00496689 …… )

条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き
             指定した方の名前で出力を行う。' :-
        get_lines('histograms.txt',Lines),
        sPLIT(Lines,['\t'],LL0),
        findall(L1,(
                    自動的に以下の条件のもとに改変して(LL0,L1)),
                LL),
        'train.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(LL).

自動的に以下の条件のもとに改変して(LL0,L1) :-
        member([File|R],LL0),
        '行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える'(File,N),
        左から順に番号を振った上で要素が0のものを削除し(0,R,L),
        水平TAB文字をすべて空白文字に変える([N|L],L1).

'行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える'(File,N) :-
        split(File,['/','-'],[_,N|_]).

左から順に番号を振った上で要素が0のものを削除し(_,[],[]).
左から順に番号を振った上で要素が0のものを削除し(N_0,[A|R1],[N:A|R2]) :-
        \+(A = '\t'),
        \+(A = 0),
        N is N_0 + 1,
        左から順に番号を振った上で要素が0のものを削除し(N,R1,R2).
左から順に番号を振った上で要素が0のものを削除し(N,[A|R1],[A|R2]) :-
        A = '\t',
        左から順に番号を振った上で要素が0のものを削除し(N,R1,R2).
左から順に番号を振った上で要素が0のものを削除し(N,[A|R1],R2) :-
        A = 0,
        左から順に番号を振った上で要素が0のものを削除し(N,R1,R2).

水平TAB文字をすべて空白文字に変える(L,S) :-
        findall(B,(
                    member(A,L),
                    水平TAB文字を空白文字に(A,B)),
                L2),
        atomic_list_concat(L2,S).

水平TAB文字を空白文字に('\t',' ') :- !.
水平TAB文字を空白文字に(A,A).

'train.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(LL) :-
        'train.datかtest.datのどちらのファイル名で出力するかを聞き',
        指定した方の名前で出力を行う(LL).

'train.datかtest.datのどちらのファイル名で出力するかを聞き' :-
        write('ファイル名を選択します。\n1.. train.dat  2.. test.dat \n').

指定した方の名前で出力を行う(LL) :-
        指定した方の名前で(_指定した方の名前),
        出力を行う(_指定して方の名前,LL).

指定した方の名前で(_指定した方の名前) :-
        整数を得る('1または2',(N == 1;N == 2),N),
        指定した方の名前で(N,_指定した方の名前).

指定した方の名前(1,'train.dat').
指定した方の名前(2,'test.dat').

出力を行う(_指定した方の名前,LL) :-
        open(_指定した方の名前,write,Outstream),
        ストリーム出力を行う(Outstream,LL),
        close(Outstream).

ストリーム出力を出力を行う(Outstream,LL) :-
        append(_,[L|R],LL),
        atomic_list_concat(L,S),
        writef(Outstream,'%t\n',[S]),
        R = [],