Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

O-Prolog JSON<->CSV 変換器

More than 1 year has passed since last update.

はじめに

O-PrologにJSONとCSVとの相互変換のライブラリを追加しました。仕様などを書き留めます。O-Prolog Ver1.62から導入されます。

ライブラリ

JSONライブラリに追加しました。use_module(library(json)). で使えます。

データ仕様

CSVは下記の形式になっているものとします。

表題部
データ部

a,b,c
1,2,3
4,5,6

CSVの内部表記

下記のcsvを述語名とし、データをその項とします。それらをリストにして全体を表します。上記の例を変換しますと下記のようになります。

[csv(a,b,c),csv(1,2,3),csv(4,5,6)]

JSONの内部表記

上記のデータは下記のように対応します。

[json([a=1,b=2,c=3]),json([a=4,b=5,c=6])]

述語

read_csv/2 第一引数は入力ストリーム。第二引数には得られたcsvデータがunifyされます。

csv_json/2 第一引数はcsvの内部データ形式、第二引数にJSONの内部形式データがunifyされます。

json_csv/2 第一引数はJSONの内部データ形式、第二引数にCSVの内部形式データがunifyされます。

json_read/1 標準入力からのJSON形式のデータを読み取り、内部JSON形式にしたものを第一引数にunifyします。

json_read/2 第一引数に入力ストリーム、ストリームから読み込んだJSONデータを内部JSON形式にしたものを第二引数にunifyします。

json_write/1 第一引数に与えられた内部JSON形式データを標準出力にJSONデータとして出力します。

json_write_2 第一引数に出力ストリーム、第二引数に与えられた内部JSON形式データをストリームにJSONデータとして出力します。

| ?- use_module(library(json)).
yes


run(F,X) :-
    open(F,read,S,[type(text),eof_action(end_of_file)]),
    read_csv(S,X),
    close(S).

| ?- run('data.csv',X).
X = [csv(a,b,c),csv(1,2,3),csv(2,3,4)]
yes
|
| ?- json_csv([json([a=1,b=2,c=3]),json([a=f,a=g,a=h])],X).
X = [csv(a,b,c),csv(f,g,h)]
yes

| ?- csv_json([csv(a,b,c),csv(1,2,3),csv(4,5,6)],X).
X = [json(a=1,b=2,c=3),json(a=4,b=5,c=6)]
yes
|

| ?-json_read(X).
{ "name":"Demo term",

  "created": {
    "day":null,
    "month":"December",
    "year":2007
  },
  "confirmed":true,
  "members":[1,2,3]
}
X = json([name='Demo term',created=json([day=null,month='December',year=2007]),confirmed=true,members=[1,2,3]])
yes

| ?- json_write(json([name='Demo term',created=json([day=null,month='December',year=2007]),confirmed=true,
members=[1,2,3]])).
{"name":"Demo term","created":{"day":null,"month":"December","year":2007},("confirmed":true,"members":[1,2,3])}yes
|

終わりに

エクセルデータをPrologで加工、分析するときのためのものです。ISO-Prologには仕様がないため、独自拡張です。

sym_num
LALの笹川です。よろしくお願いします。
http://eisl.kan-be.com/
fukuokaex
エンジニア/企業向けにElixirプロダクト開発・SI案件開発を支援する福岡のコミュニティ
https://fukuokaex.fun/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away