从文件中读取西里尔文本

时间:2012-11-10 06:45:23

标签: ruby-on-rails ruby encoding rake

我想从文件中读取文本并将其保存在数据库中。所以我写了一个示例代码,只是输出我的文件内容进行测试。我在我的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

这是我的“rake mktu:seed --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方法无法找到任何匹配项,因此我得到一个空数组。我怎样才能解决这个问题?有什么建议吗?

2 个答案:

答案 0 :(得分:0)

尝试放

# encoding: utf-8

到Rakefile的第一行。你必须告诉ruby解释器你要处理UTF 8字符... 同样使用force_encoding会给你更好的机会。

答案 1 :(得分: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

感谢您的帮助!