Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ruby中替换文件的全部内容?_Ruby_Json - Fatal编程技术网

在ruby中替换文件的全部内容?

在ruby中替换文件的全部内容?,ruby,json,Ruby,Json,如何在ruby中替换文件的全部内容 Dir["#{File.dirname(__FILE__)}/data/**/*.json"].each do |f| encoded = f.read.force_encoding('UTF-16').encode('utf-8') # ???????? end 我正在尝试重新编码一些json文件的内容。这应该可以: Dir["#{File.dirname(__FILE__)}/data/**/*.json"].each do |f| begi

如何在ruby中替换文件的全部内容

Dir["#{File.dirname(__FILE__)}/data/**/*.json"].each do |f|
  encoded = f.read.force_encoding('UTF-16').encode('utf-8')
  # ????????
end
我正在尝试重新编码一些json文件的内容。

这应该可以:

Dir["#{File.dirname(__FILE__)}/data/**/*.json"].each do |f|
  begin
    data = open(f, "r:utf-16:utf-8") {|fp| fp.read }
    open(f, "w") {|fp| fp << data }
  rescue Encoding::InvalidByteSequenceError
    # Source data isn't in UTF-16, so skip this file.
    next
  end
end
Dir[“#{File.dirname(uuu File_uu)}/data/***.json”]|
开始
data=open(f,“r:utf-16:utf-8”){| fp | fp.read}
开放式(f,“w”){| fp | fp这应该有效:

Dir["#{File.dirname(__FILE__)}/data/**/*.json"].each do |f|
  begin
    data = open(f, "r:utf-16:utf-8") {|fp| fp.read }
    open(f, "w") {|fp| fp << data }
  rescue Encoding::InvalidByteSequenceError
    # Source data isn't in UTF-16, so skip this file.
    next
  end
end
Dir[“#{File.dirname(uuu File_uu)}/data/***.json”]|
开始
data=open(f,“r:utf-16:utf-8”){| fp | fp.read}

open(f,“w”){| fp | fp这会创建一些样本测试数据:

# encoding: UTF-8
require 'json'

foo = {'a'=>%w[a b ç ∂]}
JSON.dump(foo, File.new('filein.json', 'w:UTF-16'))
当我
cat
it时,“filein.json”看起来像这样:

��{"a":["a","b","�","""]}
创建之后,这两种方法中的任何一种似乎都有效:

File.open('fileout.json', 'w:UTF-8') do |fo|
  File.open('filein.json', 'rb:UTF-16') do |fi|
    fo.write(fi.read)
  end
end
这只是通过立即写入来读取内存;它不可扩展,但大小合理的文件应该可以处理。输入读取为UTF-16,输出写入为UTF-8

JSON.dump(
  JSON.load(File.open('filein.json', 'rb:UTF-16')),
  File.open('fileout.json', 'w:UTF-8')
)
这与前面的示例类似,但它允许JSON gem解码然后重新编码文件。这可能有用,也可能不有用。而且,由于读取将文件加载到内存中,因此它不可伸缩

对于超出内存的大文件,或者如果您只想做正确的事情并使用可扩展的代码,请使用:

File.open('fileout.json', 'w:UTF-8') do |fo|
  File.foreach('filein.json', $/, encoding: 'UTF-16', mode: 'rb') do |li|
    fo.write(li)
  end
end
在上述所有情况下创建的输出“fileout.json”为:

{"a":["a","b","ç","∂"]}
要使用
Dir[]
进行搜索,请通过如下方式包装任何示例来修改它们:

Dir[File.dirname(__FILE__) + '/data/**/*.json'].each do |filein|
  File.open(filein + '.new', 'w:UTF-8') do |fo|
    File.foreach(filein, $/, encoding: 'UTF-16', mode: 'rb') do |li|
      fo.write(li)
    end
  end
end
对于每个输入文件,这将生成一个免费的“.json.new”文件。立即覆盖旧文件是不安全的,因此在运行后,您可以根据需要重命名
*.new
文件。我会使用:

Dir[File.dirname(__FILE__) + '/data/**/*.json'].each do |filein|
  new_file = "#{ filein }.new"
  File.open(new_file, 'w:UTF-8') do |fo|
    File.foreach(filein, $/, encoding: 'UTF-16', mode: 'rb') do |li|
      fo.write(li)
    end
  end
  File.mv(filein, "#{ filein }.bak")
  File.mv(new_file, filein)
end

这将创建一些样本测试数据:

# encoding: UTF-8
require 'json'

foo = {'a'=>%w[a b ç ∂]}
JSON.dump(foo, File.new('filein.json', 'w:UTF-16'))
当我
cat
it时,“filein.json”看起来像这样:

��{"a":["a","b","�","""]}
创建之后,这两种方法中的任何一种似乎都有效:

File.open('fileout.json', 'w:UTF-8') do |fo|
  File.open('filein.json', 'rb:UTF-16') do |fi|
    fo.write(fi.read)
  end
end
这只是通过立即写入来读取内存;它不可扩展,但大小合理的文件应该可以处理。输入读取为UTF-16,输出写入为UTF-8

JSON.dump(
  JSON.load(File.open('filein.json', 'rb:UTF-16')),
  File.open('fileout.json', 'w:UTF-8')
)
这与前面的示例类似,但它允许JSON gem解码然后重新编码文件。这可能有用,也可能不有用。而且,由于读取将文件加载到内存中,因此它不可伸缩

对于超出内存的大文件,或者如果您只想做正确的事情并使用可扩展的代码,请使用:

File.open('fileout.json', 'w:UTF-8') do |fo|
  File.foreach('filein.json', $/, encoding: 'UTF-16', mode: 'rb') do |li|
    fo.write(li)
  end
end
在上述所有情况下创建的输出“fileout.json”为:

{"a":["a","b","ç","∂"]}
要使用
Dir[]
进行搜索,请通过如下方式包装任何示例来修改它们:

Dir[File.dirname(__FILE__) + '/data/**/*.json'].each do |filein|
  File.open(filein + '.new', 'w:UTF-8') do |fo|
    File.foreach(filein, $/, encoding: 'UTF-16', mode: 'rb') do |li|
      fo.write(li)
    end
  end
end
对于每个输入文件,这将生成一个免费的“.json.new”文件。立即覆盖旧文件是不安全的,因此在运行后,您可以根据需要重命名
*.new
文件。我会使用:

Dir[File.dirname(__FILE__) + '/data/**/*.json'].each do |filein|
  new_file = "#{ filein }.new"
  File.open(new_file, 'w:UTF-8') do |fo|
    File.foreach(filein, $/, encoding: 'UTF-16', mode: 'rb') do |li|
      fo.write(li)
    end
  end
  File.mv(filein, "#{ filein }.bak")
  File.mv(new_file, filein)
end