루비에서 파일을 읽는 일반적인 방법은 무엇입니까?
루비에서 파일을 읽는 일반적인 방법은 무엇입니까?
예를 들어, 한 가지 방법이 있습니다.
fileObj = File.new($fileName, "r")
while (line = fileObj.gets)
puts(line)
end
fileObj.close
루비가 굉장히 유연하다는 것을 알고 있습니다.각 접근 방식의 이점/결점은 무엇입니까?
파일이 너무 길지 않은 경우 가장 쉬운 방법은 다음과 같습니다.
puts File.read(file_name)
실제로.IO.read또는File.read자동으로 파일을 닫으므로 사용할 필요가 없습니다.File.open블록으로
File.open("my/file/path", "r") do |f|
f.each_line do |line|
puts line
end
end
# File is closed automatically at end of block
위와 같이 파일을 명시적으로 닫는 것도 가능합니다. (블록을 통과하여 다음으로)open종료):
f = File.open("my/file/path", "r")
f.each_line do |line|
puts line
end
f.close
파일을 "슬립"하지 않도록 주의하십시오.그러면 전체 파일을 한 번에 메모리로 읽어 들일 수 있습니다.
문제는 그것이 잘 확장되지 않는다는 것입니다.적절한 크기의 파일을 사용하여 코드를 개발한 다음 이를 프로덕션 상태로 전환할 수 있습니다. 갑자기 기가바이트 단위의 파일을 읽으려고 하면 호스트가 메모리를 읽고 할당하려고 하면 호스트가 중지됩니다.
라인별 I/O는 매우 빠르고 거의 항상 슬러핑만큼 효과적입니다.사실 놀라울 정도로 빠릅니다.
즐겨 사용하는 항목:
IO.foreach("testfile") { |x| print "GOT ", x }
또는
File.foreach('testfile') { |x| print "GOT", x }
IO에서 파일을 상속합니다.foreachIO에 있으므로 둘 중 하나를 사용할 수 있습니다.
다음을 통해 대용량 파일을 읽는 효과를 보여주는 몇 가지 벤치마크가 있습니다.read대 "https://stackoverflow.com/q/25189262/128421 "의 라인별 I/O.
파일을 한 번에 읽을 수 있습니다.
content = File.readlines 'file.txt'
content.each_with_index{|line, i| puts "#{i+1}: #{line}"}
파일이 크거나 클 수 있는 경우 일반적으로 한 줄씩 처리하는 것이 좋습니다.
File.foreach( 'file.txt' ) do |line|
puts line
end
파일 핸들에 액세스하거나 읽기를 직접 제어해야 하는 경우가 있습니다.
File.open( 'file.txt' ) do |f|
loop do
break if not line = f.gets
puts "#{f.lineno}: #{line}"
end
end
이진 파일의 경우 다음과 같이 영 구분자와 블록 크기를 지정할 수 있습니다.
File.open('file.bin', 'rb') do |f|
loop do
break if not buf = f.gets(nil, 80)
puts buf.unpack('H*')
end
end
마지막으로 여러 파일을 동시에 처리할 때와 같이 블록 없이 작업을 수행할 수 있습니다.이 경우 파일을 명시적으로 닫아야 합니다(@antinome의 설명에 따라 개선됨).
begin
f = File.open 'file.txt'
while line = f.gets
puts line
end
ensure
f.close
end
한 가지 간단한 방법은 다음과 같습니다.
my_array = IO.readlines('filename.txt')
입력 파일의 각 행은 배열의 항목이 됩니다.메소드는 파일 열기 및 닫기를 처리합니다.
file_content = File.read('filename with extension');
puts file_content;
http://www.ruby-doc.org/core-1.9.3/IO.html#method-c-read
주로 하는 일은 다음과 같습니다.
open(path_in_string, &:read)
전체 텍스트를 문자열 개체로 제공합니다.Ruby 1.9에서만 작동합니다.
파일이 작은 경우(슬립):
puts File.read("filename.txt")
파일 크기가 큰 경우(예:
File.foreach("filename.txt") { |line| puts line }
_file.log 또는 .txt에서 마지막 n줄을 반환합니다.
path = File.join(Rails.root, 'your_folder','your_file.log')
last_100_lines = `tail -n 100 #{path}`
훨씬 더 효율적인 방법은 운영 체제의 커널에 파일을 열고 파일에서 바이트를 읽도록 요청하는 스트리밍입니다.Ruby에서 한 줄당 파일을 읽을 때, 한 번에 512바이트의 데이터를 파일에서 가져와서 "줄"로 분할합니다.
파일의 내용을 버퍼링하여 I/O 호출 수를 줄이고 파일을 논리적 청크로 분할합니다.
예:
이 클래스를 앱에 서비스 개체로 추가합니다.
class MyIO
def initialize(filename)
fd = IO.sysopen(filename)
@io = IO.new(fd)
@buffer = ""
end
def each(&block)
@buffer << @io.sysread(512) until @buffer.include?($/)
line, @buffer = @buffer.split($/, 2)
block.call(line)
each(&block)
rescue EOFError
@io.close
end
end
전화해서 전달해 주세요.:each메소드 a 블럭:
filename = './somewhere/large-file-4gb.txt'
MyIO.new(filename).each{|x| puts x }
자세한 내용은 다음 게시물을 참조하십시오.
content = `cat file`
저는 이 방법이 가장 "흔하지 않은" 방법이라고 생각합니다.좀 까다로울 수도 있지만, 효과가 있다면요.cat가 설치되어 있습니다.
언급URL : https://stackoverflow.com/questions/5545068/what-are-all-the-common-ways-to-read-a-file-in-ruby
'programing' 카테고리의 다른 글
| 문자열이 기본 유형입니까? (0) | 2023.06.04 |
|---|---|
| 'flutterfire'라는 용어가 cmdlet, 함수, 스크립트 파일 또는 작동 가능한 프로그램의 이름으로 인식되지 않습니다. (0) | 2023.06.04 |
| 날짜(현재 시간 하루 전)를 Bash로 가져옵니다. (0) | 2023.06.04 |
| 반응의 Jquery가 정의되지 않았습니다. (0) | 2023.04.05 |
| 드롭다운 목록의 첫 번째 요소 비우기 (0) | 2023.04.05 |