web-dev-qa-db-ja.com

複数のCSVファイルをSQLクエリする良い方法はありますか?

CSVファイルをリレーショナルデータベーステーブルとしてトラバースする方法を探していました。

私が見つけたものは全体として私の要件の請求書に完全には一致しなかったので、私はいくつかの調査を行いました。私はいくつかの部分的に良いオプションを見つけました、すなわち:

  1. termsql -stdinまたはファイルを受け取り、SQLを許可しますが、「テーブル」を1つだけセットアップします
  2. csv2sqlite -これは、termsqlよりも潜在的に多くのSQLの良さを可能にすることを考えると、非常に有望です-それでも1つの「テーブル」のみ
  3. このULSEの質問 -UNIXファイルトラバースコマンドを使用して集合演算を実装する方法を説明します-有望であり、可能な開始点

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'

これは私がしばらく専念できるほど興味深い問題のように思えますが、それがすでに存在するかどうかを知りたいと思います。

5

fsql (Perl)、または csvkit (Python)を見てください。どちらにもさまざまな問題と制限がありますが、「小さい」データの場合は問題ありません。そしてもちろん、十分でない場合はいつでも適切なデータベースにフォールバックできます。

3
Satō Katsura

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> 
1
Mathieu Rey

必要なのは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抽出を分析するためのより良い方法です。

それは法案に完全に適合します完全に


commPOSIXでも指定 も確認してください。これは、2つのファイルに共通の行を出力するためのものです(または、どちらか一方にのみ存在する行、または同様のもの)。

また、joincommはどちらも、ファイル名として-を使用することにより、標準入力で動作できることに注意してください。


SQLの「count()」コマンドに「group by」句を付けたものにしたい場合は、必要な列を取得するだけです(これはjoinが結合フィールドを使用してソートします。ファイルから直接)、それをuniq -cにパイプします。


Awkjoinniqcomm 、および sort の間で、次のことができます。 CSVを使ったかなり凝ったもの。そして、そのすべてがPOSIXに準拠しています。

1
Wildcard