我正在处理一个似乎采用UTF-16LE编码的文件。如果我运行
文件的第一行是:
如果我使用类似于以下的方式读取文件:
我收到一个错误提示,内容是:
如果我将上述内容的编码切换为
我到了代码中的
完整的代码如下。如果我在Rails控制台中运行它,它可以正常工作,但是如果我使用
更新-05/13/15
最终,我决定将文件字符串编码为UTF-8,而不是更深入地研究SmarterCSV代码。SmarterCSV代码中的第一个问题是它不允许用户在读取文件时指定二进制模式,但在调整源代码以处理该问题后,出现了许多其他与编码相关的问题,其中许多与处理未使用UTF-8编码的文件的各种参数有关。这可能是一种简单的解决方法,但在将所有内容编码为UTF-8之后再将其输入到SmarterCSV中解决了我的问题。
File.read(file, :encoding => 'utf-16le')
文件的第一行是:
"<U+FEFF>=\"25/09/2013\"\t18:39:17\t=\"Unknown\"\t=\"+15168608203\"\t\"Message.\"\r\n
如果我使用类似于以下的方式读取文件:
csv_text = File.read(file, :encoding => 'utf-16le')
我收到一个错误提示,内容是:
ASCII incompatible encoding needs binmode (ArgumentError)
如果我将上述内容的编码切换为
csv_text = File.read(file, :encoding => 'utf-8')
我到了代码中的
SmarterCSV
部分,但是出现了一个错误提示。`=~': invalid byte sequence in UTF-8 (ArgumentError)
完整的代码如下。如果我在Rails控制台中运行它,它可以正常工作,但是如果我使用
ruby test.rb
运行它,它会给我第一个错误:require 'smarter_csv'
headers = ["date_of_message", "timestamp_of_message", "sender", "phone_number", "message"]
path = '/path/'
Dir.glob("#{path}*.CSV").each do |file|
csv_text = File.read(file, :encoding => 'utf-16le')
File.open('/tmp/tmp_file', 'w') { |tmp_file| tmp_file.write(csv_text) }
puts 'made it here'
SmarterCSV.process('/tmp/tmp_file', {
:col_sep => "\t",
:force_simple_split => true,
:headers_in_file => false,
:user_provided_headers => headers
}).each do |row|
converted_row = {}
converted_row[:date_of_message] = row[:date_of_message][2..-2].to_date
converted_row[:timestamp] = row[:timestamp]
converted_row[:sender] = row[:sender][2..-2]
converted_row[:phone_number] = row[:phone_number][2..-2]
converted_row[:message] = row[:message][1..-2]
converted_row[:room] = file.gsub(path, '')
end
end
更新-05/13/15
最终,我决定将文件字符串编码为UTF-8,而不是更深入地研究SmarterCSV代码。SmarterCSV代码中的第一个问题是它不允许用户在读取文件时指定二进制模式,但在调整源代码以处理该问题后,出现了许多其他与编码相关的问题,其中许多与处理未使用UTF-8编码的文件的各种参数有关。这可能是一种简单的解决方法,但在将所有内容编码为UTF-8之后再将其输入到SmarterCSV中解决了我的问题。