ActiveStorage CSV文件强制编码?

时间:2018-12-03 01:14:42

标签: ruby-on-rails ruby ruby-on-rails-5 rails-activestorage

我要上传的CSV文件在将行导入数据库时​​会出现问题:

Encoding::UndefinedConversionError ("\xCC" from ASCII-8BIT to UTF-8)

最有效的方法是确保每一列都正确编码以放置在数据库中,或者被忽略。

最基本的方法是遍历每一行和每个字段并对字符串进行强制编码,但这似乎效率极低。有什么更好的方法来解决这个问题?

当前,它只是作为参数(:csv_file)上传。然后,我按如下方式访问它:

CSV.parse(csv_file.download)在模型中。

我假设在activestorage文件上调用CSV.parse时有一种强制编码的方法,但不确定如何执行。有任何想法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

最新版本的ActiveStorage(6.0.0.rc1)添加了一个API,可以将文件下载到临时文件,然后可以从中读取。我假设Ruby将使用正确的编码从文件中读取。

https://edgeguides.rubyonrails.org/active_storage_overview.html#downloading-files

如果您不想升级到Rails 6的RC(就像我不想那样),则可以使用此方法将字符串转换为UTF-8,同时摆脱可能出现在其中的字节顺序标记您的文件:

wrongly_encoded_string = active_record_model.attachment.download
correctly_encoded_string = wrongly_encoded_string.bytes.pack("c*").force_encoding("UTF-8")