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