web-dev-qa-db-ja.com

Rubyでファイルの行を読む方法

ファイルから行を読み取るために、次のコードを使用しようとしました。しかし、 ファイル を読むと、内容はすべて1行になります。

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

しかし、この ファイル は各行を別々に印刷します。


私はRuby my_prog.rb < file.txtのようにstdinを使わなければなりません。そこでは、ファイルが使う行末文字が何であるかは想定できません。どうすれば処理できますか?

217
draw

"\r\n""\r"の両方が、行を解析する前にLinux標準の"\n"に変換されるので、私の答えはあらゆるタイプの行末処理についてのあなたの新しい懸念をカバーすると私は信じています。

Windowsの通常の"\r"および"\n"と共に"\r\n" EOL文字をサポートするには、次のようにします。

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

もちろん、これはファイル全体をメモリにロードすることを意味するので、非常に大きなファイルでは悪い考えかもしれません。

139
Olivier L.

Rubyにはこのための方法があります。

File.readlines('foo').each do |line|

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

482
Jonathan
File.foreach(filename).with_index do |line, line_num|
   puts "#{line_num}: #{line}"
end

これはファイル全体をメモリに丸めることなくファイルの各行に対して与えられたブロックを実行します。 IO :: foreach を参照してください。

352
talabes

あなたの最初のファイルはMac Classicの行末を持っています(それは普通の"\r"の代わりに"\n"です)。で開く

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

行末を指定します。

17
Josh Lee

になりますか。

myFile=File.open("paths_to_file","r")
while(line=myFile.gets)
 //do stuff with line
end
6
JBoy

それは各行の終点が原因です。 Rubyのchompメソッドを使って、最後の '\ n'または 'r'を削除してください。

line_num=0
File.open('xxx.txt').each do |line|
  print "#{line_num += 1} #{line.chomp}"
end
6
Sreenivasan AC

私は、ヘッダを持つファイルに対する以下のアプローチに部分的です。

File.open(file, "r") do |fh|
    header = fh.readline
    # Process the header
    while(line = fh.gets) != nil
        #do stuff
    end
end

これにより、コンテンツ行とは異なる方法でヘッダー行を処理できます。

5
Ron Gejman

実行時にRAMを浪費する可能性がある巨大な行がある可能性があるファイルを読み込むことに関心がある場合は、ファイルをいつでも読むことができます。 「 ファイルを丸呑みするのがよくない理由 」を参照してください。

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
4
Nels