0

我只想抓取 source.txt 的第 46 到 245 列的第一行并将其写入 output.txt

source_file.each { |line| 
File.open(output_file,"a+") { |f|
    f.print ???
}

奖励:我还需要计算此范围内的字符数,因为有些可能是空格。即 38 个字符和其余的空格。

示例

source_file: (first line only, columns 45 to 245): 13287912721981239854 + 180 blank columns
output_file: 13287912721981239854   
count = 20 characters

更新:追加[46..245].delete(' ').size给了我想要的计数。

4

3 回答 3

3

如果我正确理解您的要求,那么当您只想要第一行时,没有理由抓取整个文件。如果这不是您所要求的,那么您需要更清楚地指定您试图从源文件中提取的内容。

这应该获取您需要的数据:

output_line = source_file.gets [45..244]
于 2013-10-15T13:17:57.433 回答
0

如果你写:

source_file.each { |line| 
  File.open(output_file,"a+") { |f|
    f.print ???
  }
}

您将为从输出文件读取的每一行打开然后关闭输出文件。即使您只想读取一行输入,那也是错误的做法。

而是尝试以下方法之一:

File.open(output_file, 'a') do |fo|
  File.open('path/to/input_file') do |fi|
    fo.puts fi.readline[46..245]
  end
end

这使用IO.readline,它从文件中读取一行。之后该块落空,导致输入和输出文件都自动关闭。此外,它'a'仅以附加模式打开输出文件。'a+'除非您打算追加和阅读,否则这是错误的,这很少这样做。从文档中

"a+" Read-write, starts at end of file if file exists,
    otherwise creates a new file for reading and
    writing

或者:

File.open(output_file, 'a') do |fo|
  File.foreach('path/to/input_file') do |li|
    fo.puts li[46..245]
    break
  end
end

foreach当我们逐行读取文件时最常使用。它是以可扩展的方式读取文件的主要方式。它想要循环块内的文件,这就是为什么break存在,以打破该循环。

或者:

File.foreach('path/to/input_file') do |li|
  File.write(output_file, li[46..245], -1, :mode => 'a')
  break
end

File.write当您有一堆文本或二进制文件并希望将其写入一个块然后继续前进时,这很有用。-1告诉 Ruby 移动到文件的末尾。:mode => 'a'覆盖通常会截断现有文件的默认模式。

于 2013-10-15T14:43:25.287 回答
0

也许这可以完成这项工作:

line = f.readline
columns = line.split
File.open("output.txt", "w") do |out|
  columns[46, (245 - 46 + 1)].each do |column|
    out.puts column
  end
end
break # only process first line

我曾经245 - 46 + 1指出这是我们感兴趣的列数。我还假设列由空格分隔。如果不是这种情况,您将需要更改拆分的分隔符。

于 2013-10-15T13:14:47.833 回答