我尝试使用下面的代码从文件中读取行。但是当阅读一个file时,内容都在一行中:
line_num=0File.open('xxx.txt').each do |line| print "#{line_num += 1} #{line}"end
line_num=0
File.open('xxx.txt').each do |line|
print "#{line_num += 1} #{line}"
end
但是file单独打印每一行。我必须使用stdin,比如ruby my_prog.rb < file.txt,在这里我不能假设文件使用的行尾字符是什么。我该怎么办?
ruby my_prog.rb < file.txt
t40tm48m1#
Ruby有一个方法可以做到这一点:
File.readlines('foo', chomp: true).each do |line| puts(line)end
File.readlines('foo', chomp: true).each do |line|
puts(line)
http://ruby-doc.org/core-1.9.3/IO.html#method-c-readlines
eiee3dmh2#
File.foreach(filename).with_index do |line, line_num| puts "#{line_num}: #{line}"end
File.foreach(filename).with_index do |line, line_num|
puts "#{line_num}: #{line}"
这将为文件中的每一行执行给定的块,而不会将整个文件存储到内存中。参见:IO::foreach。
mctunoxg3#
我相信我的回答涵盖了您对处理任何类型的行尾的新关注,因为在解析行之前,"\r\n"和"\r"都被转换为Linux标准的"\n"。为了支持"\r" EOL字符沿着,以及Windows中的常规"\n"和"\r\n",我会这样做:
"\r\n"
"\r"
"\n"
line_num=0text=File.open('xxx.txt').readtext.gsub!(/\r\n?/, "\n")text.each_line do |line| print "#{line_num += 1} #{line}"end
text=File.open('xxx.txt').read
text.gsub!(/\r\n?/, "\n")
text.each_line do |line|
当然,对于非常大的文件来说,这可能是一个坏主意,因为这意味着将整个文件加载到内存中。
jm81lzqq4#
您的第一个文件具有Mac Classic行尾(即"\r"而不是通常的"\n")。打开它与
File.open('foo').each(sep="\r") do |line|
以指定行尾。
fxnxkyjh5#
对于有头的文件,我倾向于使用以下方法:
File.open(file, "r") do |fh| header = fh.readline # Process the header while(line = fh.gets) != nil #do stuff endend
File.open(file, "r") do |fh|
header = fh.readline
# Process the header
while(line = fh.gets) != nil
#do stuff
这允许您以不同于内容行的方式处理标题行(或多行)。
r7knjye26#
这是因为每一行的结尾。使用ruby中的chomp方法删除结尾的'\n'或'r'。
line_num=0File.open('xxx.txt').each do |line| print "#{line_num += 1} #{line.chomp}"end
print "#{line_num += 1} #{line.chomp}"
mm9b1k5b7#
怎么样?
myFile=File.open("paths_to_file","r")while(line=myFile.gets) //do stuff with lineend
myFile=File.open("paths_to_file","r")
while(line=myFile.gets)
//do stuff with line
d4so4syb8#
不要忘记,如果你担心阅读一个文件,它可能有大量的行,在运行时可能会淹没你的RAM,你总是可以读文件零碎。参见“Why slurping a file is bad“。
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 endend
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
8条答案
按热度按时间t40tm48m1#
Ruby有一个方法可以做到这一点:
http://ruby-doc.org/core-1.9.3/IO.html#method-c-readlines
eiee3dmh2#
这将为文件中的每一行执行给定的块,而不会将整个文件存储到内存中。参见:IO::foreach。
mctunoxg3#
我相信我的回答涵盖了您对处理任何类型的行尾的新关注,因为在解析行之前,
"\r\n"
和"\r"
都被转换为Linux标准的"\n"
。为了支持
"\r"
EOL字符沿着,以及Windows中的常规"\n"
和"\r\n"
,我会这样做:当然,对于非常大的文件来说,这可能是一个坏主意,因为这意味着将整个文件加载到内存中。
jm81lzqq4#
您的第一个文件具有Mac Classic行尾(即
"\r"
而不是通常的"\n"
)。打开它与以指定行尾。
fxnxkyjh5#
对于有头的文件,我倾向于使用以下方法:
这允许您以不同于内容行的方式处理标题行(或多行)。
r7knjye26#
这是因为每一行的结尾。使用ruby中的chomp方法删除结尾的'\n'或'r'。
mm9b1k5b7#
怎么样?
d4so4syb8#
不要忘记,如果你担心阅读一个文件,它可能有大量的行,在运行时可能会淹没你的RAM,你总是可以读文件零碎。参见“Why slurping a file is bad“。