本リポジトリは、CSVファイルのデータ変換や差分チェック等、便利ツールを揃えることを目的としています。 なお、本ツールは、故あって全てPHPで実現しています。
現実点でのツールとしては、以下があります。
- cp_normal.php
- cp_by_pkey.php
- diff.php
- complex_convert.php
- add_double_quote.php
- OS
- Ubuntu系のOS
PHPをインストールする必要があります。
sudo apt install php8.1-cli
sudo apt-get install php-mbstring
phpoffice/phpspreadsheet
を利用したエクセル変換ツールを利用する場合は、追加で以下のインストールが必要。
sudo apt install php-xml
sudo apt-get install php-mbstring
sudo apt install php8.1-gd
sudo apt-get install php8.1-zip
sudo apt-get install php-curl
CSVファイルの特定列のデータを別のCSVファイルの特定列にコピーします。 なお、コピーするための様々なパラメータは以下の書式で定義します。
{
"line_range": {
"start": 1,
"end": -1
},
"column_mapping" : [
{
"src": 1,
"dst": 2
},
{
"src": 2,
"dst": 3
}
]
}
- line_range
- コピー行の範囲を
start
,end
で指定します。
- コピー行の範囲を
- column_mapping
- コピーする列情報を
src
,dst
で指定します。 - 複数列を指定したい場合は、それらのデータを列挙します。
- コピーする列情報を
イメージを膨らめせるために、サンプルデータを以下に用意しています。
- コピー元データ
- コピー先データ
ツール実行方法は以下のとおりです。
php ./cp_normal.php ./config/cp-normal.json ./data/normal/test-data-src.csv ./data/normal/test-data-dst.csv
成功すると、dump.csv
ファイルが、カレントディレクトリ直下に生成され、コピー後のデータが出力されます。
col1,col2,col3,col4,col5
dst1-1,dst1-2,src1-2,src1-3,dst1-5
dst2-1,dst2-2,src2-2,src2-3,dst2-5
dst3-1,dst3-2,src3-2,src3-3,dst3-5
親子関係のあるCSVファイルがあった場合、子のCSVファイルの各行は、特定列(外部参照キー)で親のCSVファイルの主キーと紐づけているとします。 本ツールは、その紐づけられた親のCSVファイルの特定列のデータを、子のCSVファイルの特定列にコピーするツールです。 なお、コピーするための様々なパラメータは以下の書式で定義します。
{
"start_line": 1,
"parent_pkey_cols": [ 1 ],
"parent_src_col": 0,
"child_fkey_cols": [ 2 ],
"child_dst_col": 0
}
- start_line
- 子のCSVファイルの開始行を指定します。
- parent_pkey_cols
- 親の主キー列番号を配列で指定します。
- parent_src_col
- 親のコピー元列番号を指定します。
- child_fkey_cols
- 子の外部参照キー列番号を配列で指定します。
- child_dst_col
- 子のコピー先列番号を指定します。
イメージを膨らめせるために、サンプルデータを以下に用意しています。
- 親データ
- 子データ
ツール実行方法は以下のとおりです。
php ./cp_by_pkey.php ./config/pkey.json ./data/pkey/test-data-parent.csv ./data/pkey/test-data-child.csv
成功すると、dump.csv
ファイルが、カレントディレクトリ直下に生成され、コピー後のデータが出力されます。
col1,col2,col3,col4,col5
5,child1-2,99184,child1-4,child1-5
2,child2-2,99183,child2-4,child2-5
1,child3-2,99182,child3-4,child3-5
あるCSVファイルを更新しているときに、どこをどう直したのかわからなくなる場合があります。 diffツールを使えば差分チェックはできますが、修正量が多いと、どこが追加でどこが削除でどこが更新なのか見分けるのが辛くなるケースです。 こういう場合に本ツールが本領を発揮します。
本ツールでは、主キーベースで行比較をします。 引数として、主キーの列番号と更新前のCSVファイルと更新後のCSVファイルを与えると、差分情報をを出力してくれます。
なお、本ツールの様々なパラメータは以下の書式で定義します。
{
"start_line": 1,
"pkeys": [
0,
1
]
}
- start_line
- 差分チェックの開始行を指定します。
- pkeys
- 主キー列番号を列挙します。
イメージを膨らめせるために、サンプルデータを以下に用意しています。
- 変更前のCSVファイル
- 変更後のCSVファイル
ツール実行方法は以下のとおりです。
php ./diff.php ./config/table-pkey.json ./data/diff/old.csv ./data/diff/new.csv ./diff_csv
成功すると、以下のファイルが、カレントディレクトリ直下に生成され、差分情報が出力されます。
変更があった行を出力します。ただし、出力されるのは修正前のデータ一覧となります。
p1,p2,col1,col2,col3
1,9920,data1-1,data1-2,data1-3
変更があった行を出力します。ただし、出力されるのは修正後のデータ一覧となります。
p1,p2,col1,col2,col3
1,9920,data1-1,data1-2,data1-updated
修正後に追加されたデータ一覧が出力されます。
p1,p2,col1,col2,col3
3,9920,created-1,created-2,created-3
修正後に削除されたデータ一覧が出力されます。
p1,p2,col1,col2,col3
1,9921,delete-1,delete-2,delete-3
変更がなかったデータ一覧が出力されます。
p1,p2,col1,col2,col3
2,9920,data3-1,data3-2,data3-3
2,9921,data4-1,data4-2,data4-3
本ツールは、主キーベースで連携されたCSVファイルがあった場合に、入力元のCSVファイルの様々な列を合成して、CSVファイルを生成します。
なお、生成のための様々なパラメータは以下の書式で定義します。
{
"src_pkeys": [
0
],
"dst_pkeys": [
1
],
"start_line_src": 1,
"start_line_dst": 1,
"conv_mapping" : [
{
"conv_type": "fixed",
"value": 0,
"dst": 5
},
{
"conv_type": "normal",
"src": 2,
"dst": 4
},
{
"conv_type": "split",
"split_key": "@",
"split_index": 0,
"src": 2,
"dst": 2
},
{
"conv_type": "combine",
"combine_format": "%s(st_%s)",
"srcs": [ 1, 0 ],
"dst": 3
}
]
}
- src_pkeys
- 入力元の主キー列を列挙します。
- dst_pkeys
- 出力先の主キー列を列挙します。
- start_line_src
- 入力元の開始行を指定します。
- start_line_dst
- 出力先の生成開始行を指定します。
- conv_mapping
- 様々な合成するための情報を列挙します。現時点では以下のものがあります。
- conv_type=fixed
- 出力先の列を
dst
で指定すると、value
の値が設定されます。
- 出力先の列を
- conv_type=normal
- 入力元の列を
src
で、出力先の列をdst
で指定すると、そのままコピーされます。
- 入力元の列を
- conv_type=split
- 入力元の列
src
の値をキーワードsplit_key
で分割し、split_index
番目の値をdst
の列にコピーします。
- 入力元の列
- conv_type=combine
- 入力元の列
srcs
の値(2個のみ)をcombine_format
の書式でマージして、dst
の列にコピーします。
- 入力元の列
- conv_type=combine3
- 入力元の列
srcs
の値(3個のみ)をcombine_format
の書式でマージして、dst
の列にコピーします。
- 入力元の列
- conv_type=fixed
- 様々な合成するための情報を列挙します。現時点では以下のものがあります。
イメージを膨らめせるために、サンプルデータを以下に用意しています。
- 入力元データ
- 出力先データ
ツール実行方法は以下のとおりです。
php ./complex_convert.php ./config/complex_conv.json ./data/complex/test-data-src.csv ./data/complex/test-data-dst.csv
成功すると、dump.csv
ファイルが、カレントディレクトリ直下に生成され、コピー後のデータが出力されます。
id,user_id,user_code,user_name,email,bool
1,99119,trajiro,寅次郎(st_99119),trajiro@example.com,0
,99120,yasujiro,小津安二郎(st_99120),yasujiro@example.com,0
本ツールは、単純にCSVファイル内の全データをダブルクォートで括るだけです。 Exmentのインポート対象ファイルのCSVファイルの書式がこうなっていたので、この機能を作りました。
ツール実行方法は以下のとおりです。
php ./add_double_quote.php ./dump.csv
成功すると、dump.csv
ファイルが、カレントディレクトリ直下に生成され、コピー後のデータが出力されます。
"id","user_id","user_code","user_name","email","bool"
"1","99119","trajiro","寅次郎(st_99119)","trajiro@example.com","0"
"","99120","yasujiro","小津安二郎(st_99120)","yasujiro@example.com","0"
下記を実行してください。 自動でGitHubにリリースが作成され、成果物(csv-converter.tar.gz)がアップロードされます。
$bash release.bash