我试图使用以下代码从文件中读取行。但是在阅读file时,内容都在一行中:
line_num=0
File.open('xxx.txt').each do |line|
print "#{line_num += 1} #{line}"
end
但是这个file分别打印每一行。
我必须使用stdin,比如ruby my_prog.rb < file.txt
,我不能假设该文件使用的是行尾字符。我怎么处理呢?
答案 0 :(得分:479)
Ruby确实有一个方法:
File.readlines('foo').each do |line|
答案 1 :(得分:350)
File.foreach(filename).with_index do |line, line_num|
puts "#{line_num}: #{line}"
end
这将为文件中的每一行执行给定的块,而不会将整个文件压入内存。请参阅:IO::foreach。
答案 2 :(得分:139)
我相信我的答案涵盖了处理任何类型的行结尾的新问题,因为在解析行之前"\r\n"
和"\r"
都转换为Linux标准"\n"
。
要支持"\r"
EOL字符以及来自Windows的常规"\n"
和"\r\n"
,我会这样做:
line_num=0
text=File.open('xxx.txt').read
text.gsub!(/\r\n?/, "\n")
text.each_line do |line|
print "#{line_num += 1} #{line}"
end
当然,这对于非常大的文件来说可能是一个坏主意,因为这意味着将整个文件加载到内存中。
答案 3 :(得分:17)
您的第一个文件包含Mac Classic行结尾("\r"
而不是通常的"\n"
)。用
File.open('foo').each(sep="\r") do |line|
指定行结尾。
答案 4 :(得分:6)
这是因为每行的结束。 使用ruby中的chomp方法删除末尾的'\ n'或'r'。
line_num=0
File.open('xxx.txt').each do |line|
print "#{line_num += 1} #{line.chomp}"
end
答案 5 :(得分:6)
gets怎么样?
myFile=File.open("paths_to_file","r")
while(line=myFile.gets)
//do stuff with line
end
答案 6 :(得分:5)
对于包含标题的文件,我对以下方法不感兴趣:
File.open(file, "r") do |fh|
header = fh.readline
# Process the header
while(line = fh.gets) != nil
#do stuff
end
end
这允许您以不同于内容行的方式处理标题行(或多行)。
答案 7 :(得分:4)
不要忘记,如果您担心在运行期间读取可能会占用大量行的文件,您可以随时阅读文件。请参阅&#34; Why slurping a file is bad&#34;。
File.open('file_path', 'rb') do |io|
while chunk = io.read(16 * 1024) do
something_with_the chunk
# like stream it across a network
# or write it to another file:
# other_io.write chunk
end
end