如何在Rails中解析CSV时更改编码

TW1*_*147 12 ruby csv encoding parsing ruby-on-rails

我想知道如何在导入并解析它时更改CSV文件的编码.我有这个代码:

csv = CSV.parse(output, :headers => true, :col_sep => ";")
csv.each do |row|
  row = row.to_hash.with_indifferent_access
  insert_data_method(row)
end
Run Code Online (Sandbox Code Playgroud)

当我读取我的文件时,我收到此错误:

Encoding::CompatibilityError in FileImportingController#load_file
incompatible character encodings: ASCII-8BIT and UTF-8
Run Code Online (Sandbox Code Playgroud)

我读过row.force_encoding('utf-8')但它不起作用:

NoMethodError in FileImportingController#load_file
undefined method `force_encoding' for #<ActiveSupport::HashWithIndifferentAccess:0x2905ad0>
Run Code Online (Sandbox Code Playgroud)

谢谢.

Mar*_*n M 15

我不得不阅读ISO-8859-1编码的CSV文件.做记录

CSV.foreach(filename, encoding:'iso-8859-1:utf-8', col_sep: ';', headers: true) do |row|
Run Code Online (Sandbox Code Playgroud)

扔了例外

ArgumentError: invalid byte sequence in UTF-8
    from csv.rb:2027:in '=~' 
    from csv.rb:2027:in 'init_separators' 
    from csv.rb:1570:in 'initialize' 
    from csv.rb:1335:in 'new' 
    from csv.rb:1335:in 'open' 
    from csv.rb:1201:in 'foreach'
Run Code Online (Sandbox Code Playgroud)

所以我最后读取文件并在读取时将其转换为UTF-8,然后解析字符串:

CSV.parse(File.open(filename, 'r:iso-8859-1:utf-8'){|f| f.read}, col_sep: ';', headers: true, header_converters: :symbol) do |row|
    pp row
end
Run Code Online (Sandbox Code Playgroud)


Luk*_*ell 5

force_encoding 旨在在字符串上运行,但看起来您是在散列上调用它。你可以说:

output.force_encoding('utf-8')
csv = CSV.parse(output, :headers => true, :col_sep => ";")
...
Run Code Online (Sandbox Code Playgroud)