プロローグ:CSVファイルのファクトのベース

CSV形式のファイルから事実をプロローグデータベースにインポートする





プロローグでデータベースファクトを使用するには、それら(ファクト)を外部ソースからインポートする必要があります。





この図は、従来から3つの活動分野を示しています。

黄色-中間ファイルを準備しています。 単純なインポートの場合、ドキュメントをCSV形式で保存するだけで済みます。 規則に従って動作するために、定期的なアンロード用にデータベースコンポーネント(MS SQL Server Integration Servicesなど)を構成することができます。 このアクティビティは、記事では考慮されていません。

赤-CSVファイルからファクトベースにデータをインポートします。

緑-Prologのファクトベースを操作します。

ご注意 矢印はデータストリームを示します。



SWI-Prologの実装には、CSV形式のファイルでの作業を簡素化する述語が含まれています。 プログラムを作成するための主なポイントを挙げます。

1. CSVファイルからデータを入力する


csv_read_file(File, RowList, [ separator(0';)])





ファイル-特別な形式のファイル名。

RowList-インポート後の行のリスト

関数の入力は、インポートが実行されるファイルの名前を示し、フィールド間のセパレーターを定義するパラメーターも設定します。 出力では、次の形式のリスト(RowList変数)を取得します。

 [row(…, …, …), row(…, …, …), …]
      
      







2.ファクトファイルの定義



これは、後で参照しやすくするためです。

 file(base1, csv, 'c:/pl/prj1/file.csv'). file(base1, base, 'c:/pl/prj1/file.pl').
      
      







3.ファクトベースの定義



 :- dynamic(base1/3).
      
      





このベースに事実を追加します。



4.ベースのゼロ化



 abolish(base1/3).
      
      







5.リストからのベース生成


ここで、データの前処理を行うこともできます。 たとえば、必要なフィールドのみを選択します。 assert述語は、事実をデータベースに追加します。

 perform_cl([]). perform_cl([row(N1, N2, _, N3,_)|T]):- assert(base1(N1,N2,N3)), !, perform_cl(T).
      
      





または

 forall(member(row(N1,N2,N3),RowList), assert(base1(N1,N2,N3)).
      
      





forall述語は非常に強力です。 すべてのソリューション検索代替(1パラメーター)について、2番目のパラメーターで示されたアクションを実行します。



6.データベースを外部ファイルに保存する



  file(base1, base, F), tell(F), forall( base1(N1,N2,N3), (writeq( base1(N1,N2,N3)), write('.'), nl) ), told.
      
      







7.ファイルからファクトデータベースをダウンロードする



 file(base1, base, F), Consult(F).
      
      





または

 file(base1, base, F), [F].
      
      







プログラムは完全です:





 %    % :- dynamic(base1/3). %   % %     CSV file(base1, csv, 'c:/pl/prj1/file1.csv'). %   file(base1, base, 'c:/pl/prj1/file1.pl'). %   csv    % import_base:-    %       file(base1, csv, File),    %    c  ";"   [row(..., ..., ...), ...]    csv_read_file(File, RowList, [ separator(0';)]),    %      abolish(base1/3),    %        perform_row1(RowList),!. %      % %   -  . perform_row([]). %    perform_row([row(N1, N2, _, N3,_)|T]):-    %  ,       assert(base1(N1,N2,N3)),    !,    %       perform_row(T). %     % perform_row1(RowList):-    %     :        forall(member(row(N1, N2, _, N3,_),RowList),          %            assert(base1(N1,N2,N3))). %     % save_base:-    %       file(base1, base, F),    %  ,          tell(F),    %     :       forall( base1(N1,N2,N3),        %          (writeq( base1(N1,N2,N3)), write('.'), nl)        ),    told. %    % load_base:-    %      file(base1, base, File),    %     consult(File).
      
      







ソースデータ



file1.csvファイルの内容

; 12; /; ;

; 13; /; ;

; 14; /; ;









作業プロトコル:



4 ?- import_base.

true.



5 ?- forall(base1(N1,N2,N3),writeln(base1(N1,N2,N3))).

base1( , 12, )

base1( , 13, )

base1( , 14, )

true.



6 ?- save_base.

true.



7 ?- abolish(base1/3).

true.



8 ?- forall(base1(N1,N2,N3),writeln(base1(N1,N2,N3))).

ERROR: toplevel: Undefined procedure: base1/3 (DWIM could not correct goal)



9 ?- load_base.

% c:/pl/prj1/file1.pl compiled 0.00 sec, 492 bytes

true.



10 ?- forall(base1(N1,N2,N3),writeln(base1(N1,N2,N3))).

base1( , 12, )

base1( , 13, )

base1( , 14, )

true.











ファクトデータベースファイルfile1.pl



base1(' ',' 12',' ').

base1(' ',' 13',' ').

base1(' ',' 14',' ').







おわりに



この記事では、プロローグの真の力を示すものではなく、ファクトベースの作成に関する準備作業を示すプログラムを提供します。 ただし、ファクトデータベースにインポートした後、洗練されたデータ処理方法を適用できます。 たとえば、階層構造(組織およびスタッフ構造)の制御と視覚化、請求用のデータの準備、テーブル内のデータのクリーニング(変換)など。



All Articles