複数のCSVファイルをSQLで照会する良い方法は何ですか?

複数のCSVファイルをSQLで照会する良い方法は何ですか?

私はCSVファイルをリレーショナルデータベーステーブルとして繰り返す方法を探していました。

私の要件と正確に一致するものが見つからなかったので、いくつかの調査をしました。部分的に良いオプションがいくつか見つかりました。つまり:

  1. 用語SQL- stdinまたはファイルを許可し、それに対するいくつかのSQL実行を許可しますが、「テーブル」のみを設定します。
  2. csv2sqlite- これはtermsqlよりもSQLの潜在的に多くの利点を可能にするので、非常に有望ですが、まだ「テーブル」は1つしかありません。
  3. このULSEの問題– Unix ファイルのナビゲーションコマンドを使用して収集操作を実装する方法を説明します。これは有望で可能な開始点です。

一部のデータベースと同様の操作を探索して実行することができ、非常に簡単です。一つcsv / textファイル(列の合計、平均、最小、最大、サブセットなど)ですが、2つのファイルではない場合は、2つのファイル間にある程度の接続があります。クエリのためにファイルを一時データベースにインポートすることも可能です。私が望むほど実用的ではありませんが、そうしました。

長い話を短く- 基本的に、csvファイルに迅速かつ複雑なSQL結合を実行する便利な方法が必要です。完全なテキストベースのRDBMSを見つけるのではなく、csv RDBMS抽出の分析を実行するより良い方法です。

例:

sqlthingy -i tbl1.csv tbl2.csv -o 'select 1,2,3 from tbl1, tbl2 where tbl1.1 = tbl2.1'

これは時間をかけて解決してもいいほど興味深い問題のようですが、すでに存在するか知りたいです。

答え1

見てデータベーステーブル(パール)またはcsvkit(Python)。どちらにもさまざまな問題や制限がありますが、通常は「小さい」データに適しています。もちろん、十分でない場合は、いつでも適切なデータベースに置き換えることができます。

答え2

あなたが望むのは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つのファイルに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つのファイルに共通の行を印刷するためのものです(または片側にのみ存在するか、それと同様のもの)。

また、両方ともjoinファイル名として使用され、comm標準入力で動作できます。-


「group by」句を含むSQL「count()」コマンドと同等の機能が必要な場合は、必要な列を取得します(join結合フィールドを使用してソートするか、ファイル内で直接ソートできる場合は直接ソートできます)。パイプラインを通過しますuniq -c


〜サイアッ参加するユニークコミュニケーションタイプ、CSVを使用すると、非常にクールなタスクを実行できます。これらはすべてPOSIXと互換性があります。

答え3

Apache機器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> 

関連情報