2012-11-10 41 views
0

我想從文件中讀取文本並將其保存在數據庫中。所以我寫了一個示例代碼來輸出我的文件的內容來測試。我在Ruby on Rails應用以下的rake任務:從文件中讀取西里爾文文本

require "active_support/core_ext/string" 

namespace :mktu do 
    task :seed do 
    Dir.glob("#{Rails.root}/public/mktu/*.txt") do |file| 
    puts "#{File.basename(file, ".txt")}" 
    data = File.open(file, "r").read 
    p data.encoding.name 
    break_char = ";".encode("UTF-8") 
    data.mb_chars.split(break_char) do |name| 
     puts name.strip 
    end 
    end 
    end 
end 

這裏是我的 「耙mktu:種子--trace」 輸出:

** Invoke mktu:seed (first_time) 
** Execute mktu:seed 
32 
"UTF-8" 
rake aborted! 
invalid byte sequence in UTF-8 
/home/dastan/Projects/rails/tmregister/lib/tasks/prepare.rake:32:in `split' 
/home/dastan/Projects/rails/tmregister/lib/tasks/prepare.rake:32:in `block (3 levels) in <top (required)>' 
/home/dastan/Projects/rails/tmregister/lib/tasks/prepare.rake:25:in `glob' 
/home/dastan/Projects/rails/tmregister/lib/tasks/prepare.rake:25:in `block (2 levels) in <top (required)>' 

雖然我的輸出顯示,該文件有UTF- 8編碼,看來split方法由於編碼問題而找不到任何匹配,所以我得到一個空數組。我怎樣才能解決這個問題?有什麼建議麼?

+0

你可以試試這個:break_char =「;」。encode(「UTF-8」) - > break_char =「;」。force_encoding(「UTF-8」) – nurettin

+0

@pwned同樣的員工,沒有變化。 – dastanko

+0

這是jruby嗎? – nurettin

回答

0

嘗試把

# encoding: utf-8 

的Rake文件的第一行。你必須告訴紅寶石解釋器你想處理UTF 8字符... 也使用force_encoding會給你更好的機會。

+0

沒有幫助,謝謝你的嘗試。沒有什麼改變,相同的輸出。 – dastanko

0

我找到了解決方案on page。所以我的代碼現在看起來像這樣:

task :seed => :environment do 
    Dir.glob("#{Rails.root}/public/mktu/*.txt") do |file| 
    ic = Iconv.new('UTF-8//IGNORE', 'UTF-8') 
    items = [] 

    puts "Creating mktu class #{File.basename(file, '.txt')}" 

    klass = MktuClass.create!(:title => "Класс #{File.basename(file, '.txt')}") 

    file = File.open(file, "r") 
    data = ic.iconv(file.read) 

    data.split(";").each do |item| 
     MktuItem.create!(:name => item.strip, :mktu_class_id => klass.id) 
     puts item 
    end 
    end 
end 

感謝您的幫助!