如何在Ruby中读取文件行

ggazkfy8  于 2023-10-17  发布在  Ruby
关注(0)|答案(8)|浏览(190)

我尝试使用下面的代码从文件中读取行。但是当阅读一个file时,内容都在一行中:

  1. line_num=0
  2. File.open('xxx.txt').each do |line|
  3. print "#{line_num += 1} #{line}"
  4. end

但是file单独打印每一行。
我必须使用stdin,比如ruby my_prog.rb < file.txt,在这里我不能假设文件使用的行尾字符是什么。我该怎么办?

t40tm48m

t40tm48m1#

Ruby有一个方法可以做到这一点:

  1. File.readlines('foo', chomp: true).each do |line|
  2. puts(line)
  3. end

http://ruby-doc.org/core-1.9.3/IO.html#method-c-readlines

eiee3dmh

eiee3dmh2#

  1. File.foreach(filename).with_index do |line, line_num|
  2. puts "#{line_num}: #{line}"
  3. end

这将为文件中的每一行执行给定的块,而不会将整个文件存储到内存中。参见:IO::foreach。

mctunoxg

mctunoxg3#

我相信我的回答涵盖了您对处理任何类型的行尾的新关注,因为在解析行之前,"\r\n""\r"都被转换为Linux标准的"\n"
为了支持"\r" EOL字符沿着,以及Windows中的常规"\n""\r\n",我会这样做:

  1. line_num=0
  2. text=File.open('xxx.txt').read
  3. text.gsub!(/\r\n?/, "\n")
  4. text.each_line do |line|
  5. print "#{line_num += 1} #{line}"
  6. end

当然,对于非常大的文件来说,这可能是一个坏主意,因为这意味着将整个文件加载到内存中。

jm81lzqq

jm81lzqq4#

您的第一个文件具有Mac Classic行尾(即"\r"而不是通常的"\n")。打开它与

  1. File.open('foo').each(sep="\r") do |line|

以指定行尾。

fxnxkyjh

fxnxkyjh5#

对于有头的文件,我倾向于使用以下方法:

  1. File.open(file, "r") do |fh|
  2. header = fh.readline
  3. # Process the header
  4. while(line = fh.gets) != nil
  5. #do stuff
  6. end
  7. end

这允许您以不同于内容行的方式处理标题行(或多行)。

r7knjye2

r7knjye26#

这是因为每一行的结尾。使用ruby中的chomp方法删除结尾的'\n'或'r'。

  1. line_num=0
  2. File.open('xxx.txt').each do |line|
  3. print "#{line_num += 1} #{line.chomp}"
  4. end
mm9b1k5b

mm9b1k5b7#

怎么样?

  1. myFile=File.open("paths_to_file","r")
  2. while(line=myFile.gets)
  3. //do stuff with line
  4. end
d4so4syb

d4so4syb8#

不要忘记,如果你担心阅读一个文件,它可能有大量的行,在运行时可能会淹没你的RAM,你总是可以读文件零碎。参见“Why slurping a file is bad“。

  1. File.open('file_path', 'rb') do |io|
  2. while chunk = io.read(16 * 1024) do
  3. something_with_the chunk
  4. # like stream it across a network
  5. # or write it to another file:
  6. # other_io.write chunk
  7. end
  8. end

相关问题