RSQLite パッケージを使用して、大規模な csv ファイルを SQL lite データベースにロードしようとしています (sqldf パッケージも試しました)。このファイルには、英国のすべての郵便番号と、それらのさまざまな検索値が含まれています。
Rにロードするのを避けて、データベースに直接ロードしたかったのです。これはこのタスクに厳密に必要というわけではありませんが、将来それらを処理する必要がある場合に備えて、メモリに収まらない大きなファイルに対応できるようにするために、そうしたいと考えています。
残念ながら、csv には二重引用符で囲まれた値が提供されており、dbWriteTable 関数はそれらを削除したり、どのような形式でも無視したりできないようです。ファイルのダウンロード場所は次のとおりです: http://ons.maps.arcgis.com/home/item.html?id=3548d835cff740de83b527429fe23ee0
これが私のコードです:
# Load library
library("RSQLite")
# Create a temporary directory
tmpdir <- tempdir()
# Set the file name
file <- "data\\ONSPD_MAY_2017_UK.zip"
# Unzip the ONS Postcode Data file
unzip(file, exdir = tmpdir )
# Create a path pointing at the unzipped csv file
ONSPD_path <- paste0(tmpdir,"\\ONSPD_MAY_2017_UK.csv")
# Create a SQL Lite database connection
db_connection <- dbConnect(SQLite(), dbname="ons_lkp_db")
# Now load the data into our SQL lite database
dbWriteTable(conn = db_connection,
name = "ONS_PD",
value = ONSPD_path,
row.names = FALSE,
header = TRUE,
overwrite = TRUE
)
# Check the data upload
dbListTables(db_connection)
dbGetQuery(db_connection,"SELECT pcd, pcd2, pcds from ONS_PD LIMIT 20")
この問題にぶつかったので、sqldf パッケージの使用を推奨するリファレンス チュートリアル ( https://www.r-bloggers.com/r-and-sqlite-part-1/ ) を見つけましたが、残念ながら関連する関数を使用しようとするとsqldf (read.csv.sql) では、二重引用符で同じ問題が発生します。
これは、csv ファイルを SQL システムにインポートする際によくある問題のように感じます。ほとんどのインポート ツールは二重引用符を処理できるため、これで問題が発生することに驚いています (問題に関する明らかなヘルプ ファイルを見逃していない限り)。途中のどこか)。
編集1
これは、SQL テーブルの dput 出力形式の csv ファイルからのデータの例です。
structure(list(pcd = c("\"AB1 0AA\"", "\"AB1 0AB\"", "\"AB1 0AD\"",
"\"AB1 0AE\"", "\"AB1 0AF\""), pcd2 = c("\"AB1 0AA\"", "\"AB1 0AB\"",
"\"AB1 0AD\"", "\"AB1 0AE\"", "\"AB1 0AF\""), pcds = c("\"AB1 0AA\"",
"\"AB1 0AB\"", "\"AB1 0AD\"", "\"AB1 0AE\"", "\"AB1 0AF\"")), .Names = c("pcd",
"pcd2", "pcds"), class = "data.frame", row.names = c(NA, -5L))
編集2
これは、sqldf の read.csv.sql 関数でフィルター引数を使用した試みです (Windows ユーザーは、このためにrtoolsをインストールする必要があることに注意してください)。残念ながら、不思議なことにすべてのスペースが削除されますが、これでもまだデータから引用符が削除されていないようです。
library("sqldf")
sqldf("attach 'ons_lkp_db' as new")
db_connection <- dbConnect(SQLite(), dbname="ons_lkp_db")
read.csv.sql(ONSPD_path,
sql = "CREATE TABLE ONS_PD AS SELECT * FROM file",
dbname = "ons_lkp_db",
filter = 'tr.exe -d ^"'
)
dbGetQuery(db_connection,"SELECT pcd, pcd2, pcds from ONS_PD LIMIT 5")
また、これがスタック オーバーフローの範囲内のプログラミングの質問ではないと感じた人からの投票に感謝します(?!)。