プロローグ: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',' ').

おわりに

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

Source: https://habr.com/ru/post/J112137/


All Articles