我想只抓取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
会为我提供所需的计数。
答案 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'
会覆盖通常会截断现有文件的默认模式。