如何从特定列范围打印?

时间:2013-10-15 13:10:14

标签: ruby

我想只抓取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会为我提供所需的计数。

3 个答案:

答案 0 :(得分:3)

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

这应该抓住你需要的数据:

output_line = source_file.gets [45..244]

答案 1 :(得分: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表示这是我们感兴趣的列数。我还假设列是由空格分隔的。如果不是这种情况,则需要更改拆分的分隔符。

答案 2 :(得分: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+'是错误的,这很少发生。来自the documentation

"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
当你有一个blob的文本或二进制文件时,

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