我想读取文件的内容并将其保存到变量中。通常我会做类似的事情:
text = File.read(filepath)
不幸的是,我正在使用的文件是用UTF-16LE编码的。我一直在做一些研究,看起来我需要使用File.Open来定义编码。我在某个地方读到了一个建议,即打开文件并逐行读取数据:
text = File.open(filepath,"rb:UTF-16LE") { |file| file.lines }
但是,如果我跑:
puts text
我明白了:
#<Enumerator:0x23f76a8>
如何将UTF-16LE文件的内容读入变量?
注意:我使用的是Ruby 1.9.3和Windows操作系统
答案 0 :(得分:6)
不推荐使用lines
方法。如果您希望text
是包含行的数组,请使用readlines
。
text = File.open(filepath,"rb:UTF-16LE"){ |file| file.readlines }
正如Tin Man所说,如果可能的话,最好分开处理每一条线:
File.open("test.csv", "rb:UTF-16LE") do |file|
file.each do |line|
p line
end
end
答案 1 :(得分:1)
首先,除非你绝对必须,否则不要将文件直接读入变量。这被称为&#34; slurping&#34;,并且不具备可扩展性。相反,请逐行阅读。
Ruby的IO类,File继承自,支持一个名为open_args
的参数,这是一个哈希,大部分是&#34; read&#34;打字电话。例如,以下是一些方法签名:
read(name, [length [, offset]], open_args)
readlines(name, sep=$/ [, open_args])
The documentation说open_args
:
If the last argument is a hash, it specifies option for internal open(). The key would be the following. open_args: is exclusive to others. encoding: string or encoding specifies encoding of the read string. encoding will be ignored if length is specified. mode: string specifies mode argument for open(). It should start with "r" otherwise it will cause an error. open_args: array of strings specifies arguments for open() as an array.