ファイルから行を読み取るために、次のコードを使用しようとしました。しかし、 ファイル を読むと、内容はすべて1行になります。
line_num=0
File.open('xxx.txt').each do |line|
print "#{line_num += 1} #{line}"
end
しかし、この ファイル は各行を別々に印刷します。
私はRuby my_prog.rb < file.txt
のようにstdinを使わなければなりません。そこでは、ファイルが使う行末文字が何であるかは想定できません。どうすれば処理できますか?
"\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
もちろん、これはファイル全体をメモリにロードすることを意味するので、非常に大きなファイルでは悪い考えかもしれません。
Rubyにはこのための方法があります。
File.readlines('foo').each do |line|
File.foreach(filename).with_index do |line, line_num|
puts "#{line_num}: #{line}"
end
これはファイル全体をメモリに丸めることなくファイルの各行に対して与えられたブロックを実行します。 IO :: foreach を参照してください。
あなたの最初のファイルはMac Classicの行末を持っています(それは普通の"\r"
の代わりに"\n"
です)。で開く
File.open('foo').each(sep="\r") do |line|
行末を指定します。
は になりますか。
myFile=File.open("paths_to_file","r")
while(line=myFile.gets)
//do stuff with line
end
それは各行の終点が原因です。 Rubyのchompメソッドを使って、最後の '\ n'または 'r'を削除してください。
line_num=0
File.open('xxx.txt').each do |line|
print "#{line_num += 1} #{line.chomp}"
end
私は、ヘッダを持つファイルに対する以下のアプローチに部分的です。
File.open(file, "r") do |fh|
header = fh.readline
# Process the header
while(line = fh.gets) != nil
#do stuff
end
end
これにより、コンテンツ行とは異なる方法でヘッダー行を処理できます。
実行時に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