1

それぞれ 1050 列 (ヘッダーなし) のカンマ区切りのテキスト ファイルが何千もあるとします。すべてのテキスト ファイルを 1 つのテーブル、SQLite の 1 つのデータベースに連結してインポートする方法はありますか (理想的には、R と sqldf を使用して SQlite と通信します)。

すなわち、

各ファイルは、table1.txt、table2.txt、table3.txt と呼ばれます。行数はすべて異なりますが、列の種類は同じで、IDs 列 (各ファイルの最初の列) の一意の ID が異なります。

table1.txt
id1,20.3,1.2,3.4
id10,2.1,5.2,9.3
id21,20.5,1.2,8.4
table2.txt
id2,20.3,1.2,3.4
id92,2.1,5.2,9.3
table3.txt
id3,1.3,2.2,5.4
id30,9.1,4.4,9.3

実際の例はほとんど同じですが、列と行が増えています。ご覧のとおり、各ファイルの最初の列は一意の ID に対応しています。

今、私はスーパーテーブル、DB、super.db の新しいテーブルを (一意にインデックス化されている) にしたいと考えています。

super.db - name of the DB
mysupertable - name of the table in the DB
myids,v1,v2,v3
id1,20.3,1.2,3.4
id10,2.1,5.2,9.3
id21,20.5,1.2,8.4
id2,20.3,1.2,3.4
id92,2.1,5.2,9.3
id3,1.3,2.2,5.4
id30,9.1,4.4,9.3

参考までに、私は SQLite3 を使用しています。sqlite3 インタープリターに対話的にログインせずにバックグラウンドで実行できる SQL コマンド、つまり IMPORT bla INTO を探しています...

私はUNIXで試すことができます:

cat *.txt > allmyfiles.txt

そして.sqlファイル、

CREATE TABLE test (myids varchar(255), v1 float, v2 float, v3 float);
.separator ,
.import output.csv test

しかし、私は R を使用しているため、このコマンドは機能しませんsqldf librarydbGetQuery(db, sql)また、エラーを発生させずに R でそのような文字列を作成する方法がわかりません。

ps DB からテーブルを追加するために同様の Q を尋ねましたが、今回は DB からテーブルではなくテキスト ファイルを追加/インポートする必要があります。

4

2 に答える 2

1

いずれにしても sqlite データベース ファイルを使用している場合は、RSQLite を使用することを検討してください。

install.packages( "RSQLite" )        # will install package "DBI"
library( RSQLite )
db <- dbConnect( dbDriver("SQLite"), dbname = "super.db" )

次のコマンドを使用して、R 内で unix コマンドを使用できます。これは、R のどのループよりも高速ですsystem()

system( "cat *.txt > allmyfiles.txt" )

フォーマットが一貫していれば、それをdata.frameallmyfiles.txtとして R にインポートできます。

allMyFiles <- read.table( "allmyfiles.txt", header = FALSE, sep = "," )

@Martín Belのアドバイスに従って、次のような方法でデータベースに書き込みます

dbWriteTable( db, "mysupertable", allMyFiles, overwrite = TRUE, append = FALSE )

編集:

または、R を介してデータをルーティングしたくない場合は、system()コマンドの使用に頼ることができます。これで始められるかもしれません:

という名前の SQLite に取得するデータを含むファイルがありますallmyfiles.txt。この内容で呼び出されるファイルを作成しますtable.sql(明らかに構造が一致している必要があります)。

CREATE TABLE mysupertable (myids varchar(255), v1 float, v2 float, v3 float);
.separator ,
.import allmyfiles.txt mysupertable

Rから呼び出します

system( "sqlite3 super.db < table.sql" )

これにより、R を介したデータのルーティングは回避されますが、R 内からすべての作業が行われます。

于 2014-01-16T06:34:54.663 に答える
0

termsql を見てください。

https://gitorious.org/termsql/pages/Home

猫 *.txt | termsql -d ',' -t mysupertable -c 'myids,v1,v2,v3' -o mynew.db

これでうまくいくはずです。

于 2014-11-23T20:36:30.257 に答える