2013-03-20 2 views
2

Привет Я пытаюсь импортировать данные CSV в пространственную базу данных Postgres. Данные доступны here. Я не знаю, где я ошибся, и любая помощь очень ценится! То, что я пытаюсь сделать, - это визуализировать данные с D3.js и, возможно, отображать плотность тепла большинства библиотек в каждом городе или что-то в этом роде.Импорт пространственных данных CSV в базу данных Postgres/PostGIS с помощью команды rake

File: lib/tasks/import_incidents_csv.rake 

require 'csv' 

namespace :import_incidents_csv do 

    task :create_incidents => :environment do 

    csv_text = File.read('/home/mgmacri/data/PublicLibraryBranchLocations.csv') 
    csv = CSV.parse(csv_text, :headers => true) 

    csv.each do |row| 
     row = row.to_hash.with_indifferent_access 
     Moulding.create!(row.to_hash.symbolize_keys) 
    end 

    end 

end 


[email protected]:/spatial_project$: rake import_incidents_csv:create_incidents --trace 
** Invoke import_incidents_csv:create_incidents (first_time) 
** Invoke environment (first_time) 
** Execute environment 
** Execute import_incidents_csv:create_incidents 
rake aborted! 
invalid byte sequence in UTF-8 
/usr/lib/ruby/1.9.1/csv.rb:1855:in `sub!' 
/usr/lib/ruby/1.9.1/csv.rb:1855:in `block in shift' 
/usr/lib/ruby/1.9.1/csv.rb:1849:in `loop' 
/usr/lib/ruby/1.9.1/csv.rb:1849:in `shift' 
/usr/lib/ruby/1.9.1/csv.rb:1791:in `each' 
/usr/lib/ruby/1.9.1/csv.rb:1805:in `to_a' 
/usr/lib/ruby/1.9.1/csv.rb:1805:in `read' 
/usr/lib/ruby/1.9.1/csv.rb:1379:in `parse' 
/home/mgmacri/rails/mymap/lib/tasks/import_incidents_csv.rake:8:in `block (2 levels) in          
/var/lib/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:228:in `call' 
/var/lib/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:228:in `block in execute' 
/var/lib/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:223:in `each' 
/var/lib/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:223:in `execute' 
/var/lib/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:166:in `block in   invoke_with_call_chain' 
/usr/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' 
/var/lib/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:159:in `invoke_with_call_chain' 
/var/lib/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:152:in `invoke' 
/var/lib/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:143:in `invoke_task' 
/var/lib/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:101:in `block (2 levels)  in top_level' 
/var/lib/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:101:in `each' 
/var/lib/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:101:in `block in top_level' 
/var/lib/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:110:in `run_with_threads' 
/var/lib/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:95:in `top_level' 
/var/lib/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:73:in `block in run' 
/var/lib/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:160:in `standard_exception_handling' 
/var/lib/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:70:in `run' 
/var/lib/gems/1.9.1/gems/rake-10.0.3/bin/rake:33:in `<top (required)>' 
/usr/local/bin/rake:19:in `load' 
/usr/local/bin/rake:19:in `<main>' 
Tasks: TOP => import_incidents_csv:create_incidents 

ответ

2

Использование родного импорта CSV PostGreSQL является несколько порядков быстрее, чем при использовании CSV API в Ruby, а также могут избежать те же вопросы кодирования ,

Например:

namespace :import_incidents_csv do 
    task :create_incidents => :environment do 
    ActiveRecord::Base.connection.execute "COPY moulding (name, state, postcode, lat, long) FROM '/home/mgmacri/data/PublicLibraryBranchLocations.csv' DELIMITER ',' CSV;" 
    end 
end 

Подробнее: http://www.postgresql.org/docs/9.2/static/sql-copy.html

3

Excel кодирует файл в ISO-8859-1 и не в UTF-8. Так сказать, рубин, чтобы открыть файл с только для чтения в ISO-8859-1

file=File.open("input_file", "r:ISO-8859-1") 
+0

Excel использует кодовую ANSI по умолчанию, а не набор символов ISO. Это не совсем то же самое. Например, ISO-8859-1 аналогичен, но не идентичен cp1252 (иначе известный как Windows-1252). Лучше всего использовать правильную кодовую страницу, а не гадать при достаточно близком кодировании - или еще лучше, сохраните листы Excel в UTF-8 с помощью OpenOffice и сохраните свое здравомыслие. Обратите внимание, что Excel будет использовать другую кодовую страницу для разных систем; например, центральные европейские пользователи, вероятно, отправят вам текст cp1251. См. Http://stackoverflow.com/questions/508558/what-charset-does-microsoft-excel-use-when-saving-files –

+1

См. Также http://en.wikipedia.org/wiki/Windows-1252, в котором объясняется среди прочего, что Windows-1252 даже не ANSI-стандарт, хотя Windows называет его кодовой страницей ANSI. –

+0

@Craig: Спасибо за объяснение. –

Смежные вопросы