2014-01-16 144 views
1

讓我們說我有成千上萬的逗號分隔的文本文件,每個文本文件有1050列(無標題)。有沒有辦法將所有文本文件連接並導入到一個表中,SQLite中的一個數據庫(理想情況下,我會使用R和sqldf與SQlite進行通信)。連接文本文件並將它們導入SQLite數據庫

即,

每個文件被調用時,table1.txt,table2.txt,table3.txt;所有不同數量的行,但相同的列類型以及ID列(每個文件的第一列)中的不同唯一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。

現在,我想我在超表新表,在數據庫中,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的;我要尋找一個SQL命令,我可以在沒有交互式登錄到sqlite3的解釋在後臺運行,即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 library,並dbGetQuery(db, sql),我不知道如何創建R,使得字符串沒有得到一個錯誤。

p.s.我問了一個類似的Q從數據庫追加表,但這次我需要從數據庫中追加/導入文本文件而不是表。

+0

您應該看看RSQLite包,用於從R表創建表到SQLite數據庫。 '''sqldf'''包是用於在R裏面使用SQL的。請看[RSQLite手冊]的第12頁(http://cran.r-project.org/web/packages/RSQLite/RSQLite.pdf )。 'dbWriteTable()'''可能是你需要的。嘗試創建一個表,然後嘗試循環休息。 – marbel

+0

您可以使用SQLite附帶的'sqlite3'程序按照您所顯示的方式創建數據庫,然後從創建的數據庫的R上直接使用sqldf或更可能的RSQLite。 –

回答

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") 

只要你allmyfiles.txt有一個統一的格式,你可以導入它作爲一個data.frame爲R

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

,並將其寫入到數據庫,以下@馬丁貝爾的意見,喜歡的東西

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.

+0

謝謝。這就說得通了。雖然allmyfiles.txt是一個大文件,所以在R中讀取並寫入數據庫是多餘的,但我認爲它效率很低。最好的辦法是有一個命令與數據庫對話並導入所有文件,但不知道是否有可能。 – Dnaiel

相關問題