我正在尝试从CSV创建Rails区域设置文件。创建文件并正确解析了CSV,但未填充文件。我没有错误,所以我不知道怎么了...
这是我的代码:
draw_tile
# frozen_string_literal: true
class FillLanguages
require 'csv'
def self.get
result = []
file = File.new('config/locales/languages.yml', 'w')
CSV.foreach('lib/csv/BCP-47_french.csv', headers: false, col_sep: ';') do |row|
result.push(row[0])
hash = {}
key = row[0]
hash[key] = row[1]
file.puts(hash.to_yaml)
end
result
end
end
返回
Rails.logger.debug(hash)
符合预期。
{"af-ZA"=>"Africain (Afrique du Sud)"}
{"ar-AE"=>"Arabe (U.A.E.)"}
{"ar-BH"=>"Arabe (Bahreïn)"}
{"ar-DZ"=>"Arabe (Algérie)"}
{"ar-EG"=>"Arabe (Egypte)"}
{"ar-IQ"=>"Arabe (Irak)"}
...
返回
Rails.logger.debug(hash.to_yaml)
但是文件仍然为空。
我的CSV如下:
https://i.gyazo.com/f3fa5ba8b1bfdd014018da5b46fa7ec0.png
即使我尝试在创建文件的行之后放置“ hello world”之类的字符串,也行不通...
答案 0 :(得分:3)
您忘记关闭文件。
您可以显式地进行操作(最佳实践是在ensure
块中进行操作),也可以使用File.open
with block。
更新:
IO#close → nil
关闭ios并刷新对操作系统的所有挂起写入。该流不可用于任何进一步的数据操作;如果尝试这样做,则会引发IOError。当垃圾回收器声明I / O流时,它们会自动关闭。
https://ruby-doc.org/core-2.5.0/IO.html#method-i-close
因此,您的更改不会从IO缓冲区刷新到磁盘。您也可以使用显式IO#flush
来执行此操作,但是最好关闭打开的文件。
# explicit close
class FillLanguages
require 'csv'
def self.get
result = []
file = File.new('config/locales/languages.yml', 'w')
CSV.foreach('lib/csv/BCP-47_french.csv', headers: false, col_sep: ';') do |row|
result.push(row[0])
hash = {}
key = row[0]
hash[key] = row[1]
file.puts(hash.to_yaml)
end
result
ensure
file.close
end
end
-
# block version
class FillLanguages
require 'csv'
def self.get
result = []
File.open('config/locales/languages.yml', 'w') do |file|
CSV.foreach('lib/csv/BCP-47_french.csv', headers: false, col_sep: ';') do |row|
result.push(row[0])
hash = {}
key = row[0]
hash[key] = row[1]
file.puts(hash.to_yaml)
end
end
result
end
end