CSVファイルをリレーショナルデータベーステーブルとしてトラバースする方法を探していました。
私が見つけたものは全体として私の要件の請求書に完全には一致しなかったので、私はいくつかの調査を行いました。私はいくつかの部分的に良いオプションを見つけました、すなわち:
singlecsv/textファイル(列の合計、平均、最小、最大)に対してデータベースのようないくつかの操作をトラバースして実行することは可能で、非常に簡単です、サブセットなど)。ただし、2つのファイルではなく、それらの間にいくつかの接続があります。クエリのためにファイルを一時DBにインポートすることも可能であり、私が望むほど実用的ではありませんが、これを実行しました。
TL; DR-基本的に、csvファイルですばやくダーティなSQL結合を行うための便利な方法が必要です。本格的なテキストベースのRDBMSを探すのではなく、csv RDBMS抽出を分析するためのより良い方法です。
例:
sqlthingy -i tbl1.csv tbl2.csv -o 'select 1,2,3 from tbl1, tbl2 where tbl1.1 = tbl2.1'
これは私がしばらく専念できるほど興味深い問題のように思えますが、それがすでに存在するかどうかを知りたいと思います。
Apache Drill CSVファイルとJSONファイルを直接クエリし、それらを結合できます。
初めてファイルの場所を定義し、ファイル拡張子(最初の行をヘッダーとして使用するかどうかなど)に基づいて設定を調整するだけで済みます。
次に、mysql
クライアントを使用しているかのようになりますが、テーブルはディスク上の実際のファイルです
$ ./bin/drill-embedded
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=512M; support was removed in 8.0
Nov 07, 2017 7:05:52 PM org.glassfish.jersey.server.ApplicationHandler initialize
INFO: Initiating Jersey application, version Jersey: 2.8 2014-04-29 01:25:26...
Apache drill 1.11.0
"drill baby drill"
0: jdbc:drill:zk=local> SELECT ix.field1, o.field2, o.field3
. . . . . . . . . . . > FROM dfs.myfolder.`file1.tsv` ix
. . . . . . . . . . . > LEFT JOIN dfs.myfolder.`file2.tsv` o ON (o.field=ix.field)
. . . . . . . . . . . > LIMIT 10;
+-------------+-------------+---------------+
| field1 | field2 | field3 |
+-------------+-------------+---------------+
...redacted...
+-------------+-------------+---------------+
10 rows selected (0.656 seconds)
0: jdbc:drill:zk=local>
必要なのはjoin
コマンドです。これは POSIXで指定 です。
これがあなたの疑似コードコマンドの例です:
sqlthingy -i tbl1.csv tbl2.csv -o 'select 1,2,3 from tbl1, tbl2 where tbl1.1 = tbl2.1'
join
を使用した実際のコマンドは次のとおりです。
join -t, tbl1.csv tbl2.csv
両方のファイルにコンマ区切りの2つのフィールドしかない場合、このjoin
コマンドはまさに擬似コードで表すものです。
さらに多くのフィールドがあり、各ファイルの2番目のフィールドのみが必要で、それでも最初のフィールドで結合する場合は、次のようにします。
join -t, -o 0,1.2,2.2 tbl1.csv tbl2.csv
別のフィールドに参加したい場合は、そのためのフラグもあります。
本格的なRDBMSではありません。たとえば、2つのファイルと1つの結合フィールドに制限されています。しかし、あなたが要求したもののために:
TL; DR-基本的に、csvファイルに対して迅速かつダーティーなSQL結合を行うための便利な方法を望みます。本格的なテキストベースのRDBMSを探すのではなく、csv RDBMS抽出を分析するためのより良い方法です。
それは法案に完全に適合します完全に。
comm
、 POSIXでも指定 も確認してください。これは、2つのファイルに共通の行を出力するためのものです(または、どちらか一方にのみ存在する行、または同様のもの)。
また、join
とcomm
はどちらも、ファイル名として-
を使用することにより、標準入力で動作できることに注意してください。
SQLの「count()」コマンドに「group by」句を付けたものにしたい場合は、必要な列を取得するだけです(これはjoin
が結合フィールドを使用してソートします。ファイルから直接)、それをuniq -c
にパイプします。
Awk 、 join 、 niq 、 comm 、および sort の間で、次のことができます。 CSVを使ったかなり凝ったもの。そして、そのすべてがPOSIXに準拠しています。