Rubyスクリプトを作成して、約150k行のタブ区切りのテキストファイルをSQLiteにインポートします。ここでは、これまでのところです:gsub
にもかかわらず、単一引用符を含む最初の行にRuby SQLite用の文字列をエスケープする
require 'sqlite3'
file = File.new("/Users/michael/catalog.txt")
string = []
# Escape single quotes, remove newline, split on tabs,
# wrap each item in quotes, and join with commas
def prepare_for_insert(s)
s.gsub(/'/,"\\\\'").chomp.split(/\t/).map {|str| "'#{str}'"}.join(", ")
end
file.each_line do |line|
string << prepare_for_insert(line)
end
database = SQLite3::Database.new("/Users/michael/catalog.db")
# Insert each string into the database
string.each do |str|
database.execute("INSERT INTO CATALOG VALUES (#{str})")
end
スクリプトエラーうちは私のprepare_for_insert
方法で単一引用符をエスケープする:それはアウトにerroringだ
/Users/michael/.rvm/gems/ruby-1.9.3-p0/gems/sqlite3-1.3.5/lib/sqlite3/database.rb:91:
in `initialize': near "s": syntax error (SQLite3::SQLException)
puts string[14]
でその行を調べると、「s」の近くにエラーが表示されている箇所がわかります。これは次のようになります:'Touch the Top of the World: A Blind Man\'s Journey to Climb Farther Than the Eye Can See'
一重引用符がエスケープされているように見えますが、どうして私はまだエラーが表示されますか?
パーフェクト。それは今働く。 34列あります。だから、見た目がグーフィーです。「(?、?、?、?、?、?、?、?、?、?、?、?、?、?、?期待される列数を表現する正しい方法ですか?私はCSVパーサーも組み込んでいます。 – michaelmichael
@michaelmichael:はい、34個の引数を 'ins.execute'に入れますが、引数を配列に入れておき、' ins.execute(* array) 'することでgoofinessをチェックすることができます。また、 '(['?'] * 34).join( '、')'を使ってプレースホルダを構築することもできます(これは、あなたが使っている文字列を正確に知っていて、しかし、問題を尋ねる)。 –