Я создаю сценарий Ruby для импорта текстового файла с разделителями табуляции, состоящего примерно из 150 тыс. строк, в 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
Сценарий выдает ошибку в первой строке, содержащей одинарную кавычку, несмотря на gsub
для выхода из одинарных кавычек в моем методе prepare_for_insert
:
/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)
Это ошибка в строке 15. Если я проверю эту строку с помощью puts string[14]
, я увижу, где она показывает ошибку рядом с «s». Выглядит так: 'Touch the Top of the World: A Blind Man\'s Journey to Climb Farther Than the Eye Can See'
Похоже, одинарная кавычка экранирована, так почему я все еще получаю сообщение об ошибке?