Как читать строки файла в Ruby
Я пытался использовать следующий код для чтения строки из файла. Но при чтении 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
, где я не могу предположить, какой символ окончания строки используется в файле. Как я могу с этим справиться?
8 ответов:
Я считаю, что мой ответ охватывает новые опасения по поводу обработки любых типов окончаний строк, так как
"\r\n"
и"\r"
преобразуются в стандарт Linux"\n"
перед разбором строк.в поддержку
"\r"
символ EOL вместе с обычным"\n"
и"\r\n"
из Windows, вот что я бы сделал: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
конечно, это может быть плохой идеей для очень больших файлов, так как это означает загрузку всего файла в память.
File.foreach(filename).with_index do |line, line_num| puts "#{line_num}: #{line}" end
это будет выполнять данный блок для каждой строки в файле, не прихлебывая весь файл в память. Смотрите:IO:: foreach.
ваш первый файл имеет MAC классические окончания строк (это
"\r"
вместо"\n"
). Откройте его с помощьюFile.open('foo').each(sep="\r") do |line|
для указания конца строки.
Это из-за лицевых линий в каждой линии. Используйте метод chomp в ruby для удаления конечной строки '\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
Это позволяет обрабатывать строку заголовка (или строки) иначе, чем строки содержимого.
как о получает ?
myFile=File.open("paths_to_file","r") while(line=myFile.gets) //do stuff with line end
Не забывайте, что если вы обеспокоены чтением в файле, который может иметь огромные строки, которые могут затопить вашу оперативную память во время выполнения, вы всегда можете прочитать файл piece-meal. Смотрите "почему прихлебывать файл плохо".
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