如何将多维数组写入单独的文件,然后在Ruby中按顺序读取它们

时间:2016-04-11 18:16:58

标签: ruby

我想获取一个文件,将文件读入我的程序并将其拆分为字符,将生成的字符数组拆分为每个5,000个字符的多维数组,然后将每个单独的数组写入同一位置的文件中。

我拿了一个文件,读了它,然后创建了多维数组。现在我想将每个单独的维度数组写入单独的文件中。

该文件是通过用户输入获得的。然后我创建了一个链式辅助方法,将文件存储到第一个mixin中的数组中,然后将其传递给另一个方法,将其分解为多维数组,最后将其移交到当前设置的链的末尾创建一个我将放置这些文件的新目录。

require 'Benchmark/ips'

file = "C:\\test.php"
class String
  def file_to_array
    file = self
    return_file = File.open(file) do |line|
      line.each_char.to_a
    end
    return return_file
  end
  def file_write
    file_to_write = self
    if Dir.exist?("I:\\file_to_array")
      File.open("I:/file_to_array/tmp.txt", "w") { |file| file.write(file_to_write) }
      read_file = File.read("I:/file_to_array/tmp.txt")
    else
      Dir.mkdir("I:\\file_to_array")
    end
  end
end

class Array
  def file_divider
    file_to_divide = self
    file_to_separate = []
    count = 0
    while count != file_to_divide.length
      separator = count % 5000
      if separator == 0
        start = count - 5000
        stop = count
        file_to_separate << file_to_divide[start..stop]
      end
      count = count + 1
    end
    return file_to_separate
  end
  def file_write
    file_to_write = self
    if Dir.exist?("I:\\file_to_array")
      File.open("I:/file_to_array/tmp.txt", "w") { |file| file.write(file_to_write) }
    else
      Dir.mkdir("I:\\file_to_array")
    end
  end
end
Benchmark.ips do |result|
  result.report { file.file_to_array.file_divider.file_write }
end

test.php的

<?php
echo "hello world"
?>

2 个答案:

答案 0 :(得分:1)

这个未经测试的代码是我开始将文本分成块并保存的地方:

str = "I want to take a file"

str_array = str.scan(/.{1,10}/) # => ["I want to ", "take a fil", "e"]

str_array.each.with_index(1) do |str_chunk, i|
  File.write("output#{i}", str_chunk)
end

这不符合词边界。

阅读单独的输入文件很简单;如果您知道输入永远不会超过可用内存并且您不关心性能,则可以使用read

进一步思考,如果你想读取一个文本文件并将其内容分解成更小的文件,那么请以块的形式阅读:

input = File.open('input.txt', 'r')
i = 1
until input.eof? do
  chunk = input.read(10)
  File.write("output#{i}", chunk)
  i += 1
end
input.close

甚至更好,因为它会自动关闭输入:

File.open('input.txt', 'r') do |input|
  i = 1
  until input.eof? do
    chunk = File.read(10)
    File.write("output#{i}", chunk)
    i += 1
  end
end

那些没有经过测试,但它看起来是正确的。

答案 1 :(得分:0)

使用标准File API和Serialisation

File.write('path/to/yourfile.txt', Marshal.dump([1, 2, 3]))