>

설명하기 어려울 수 있지만 시도하겠습니다.

다음을 포함하는 텍스트 파일이 있다고합시다 :

variable one
I'm variable 2
300
False
I am variable 5

이와 같은 파일이 여러 개 있다고 가정하고 각 파일의 내용을 모릅니다. 파일의 각 줄을 가져 와서 변수에 넣고 싶습니다.

예를 들어이 파일은 이러한 변수가됩니다 ( if 를 사용하여 문자열, 숫자 및 부울로 정렬 할 수 있음).  진술) :

var1 = "variable one"
var2 = "I'm variable 2"
var3 = 300
var4 = False
var5 = "I am variable 5"

이 줄을 여러 줄의 파일에 적용 할 수 있는지 확인하고 싶습니다.

다음은 코드가 다음과 같은 코드의 예입니다.

File.open("file.txt").each do |line|
  var.new = "var" + line.line_number #creates new variable named "var" and the line number
var = line
end

나는 완전히 혼란에 빠졌기 때문에 누군가가 이것을 이해하고 이해하기를 바랍니다. 나는 여기에 모든 사람들이 일반적으로 알고 있고 그것을 잃어 버렸거나 모르는 간단한 해결책이 있다고 생각합니다.

감사합니다, Reece


  • 답변 # 1

    이것은 귀하의 질문에 대한 답변이지만, 실제로 귀하의 응용 프로그램에 중요한 방식 으로이 작업을 수행해야합니다.

    이것이 유일한 방법 일 수도 있고 "최상의"방법 일 필요는 없지만 제 생각에는 가장 간단합니다 :

    File.read("file.txt").split("\n").each_with_index do |line, index|
      instance_variable_set("@var#{index}", line) 
    end
    @var0 #variable one
    @var1 #I'm variable 2
    
    

    False 를 변환하려면  그리고 300  문자열로부터 – 파일에서 읽는 방법 – 루비 객체로, 수동 파싱을해야합니다. 말해봐

    def content_for_line(line)
      if line == 'False'
        return false
      end
      if line.to_s == line.to_i.to_s
        return line.to_i 
      end
      line
    end
    ...
    instance_variable_set("@var#{index}", content_for_line(line))
    
    

    파일을 배열로만 읽고 싶을 수도 있습니다.

    array = File.read("file.txt").split("\n")
    array[0] #variable one
    
    

  • 답변 # 2

    여기서 배열을 원하는 것 같습니다. 이를 위해 파일을 한 줄에 하나씩 배열로 직접 읽을 수 있습니다.

    array_of_lines = File.readlines("file.txt")
    array_of_lines[0]
    => "variable one\n"
    array_of_lines[1]
    => "300\n"
    
    

    etc

  • 답변 # 3

    이 구문 분석 로직이 내장 된 클래스로 구현할 수 있습니다 (주어진 예제 만 처리했습니다) :

    class VarGroup
      attr_reader :vars
      def initialize(file_name)
        @vars = File.foreach(file_name).map do |l|
          if l =~ /(True|False)/i
            l.match?(/True/i)
          else  
            begin  
              Integer(l)
            rescue ArgumentError 
              l.strip
            end  
          end
        end
      end
      def method_missing(method_name,*args,&block)
        if method_name =~ /var(\d+)/ && $1.to_i.nonzero? && $1.to_i <= vars.size
          @vars[$1.to_i - 1] 
        else 
          super
        end
      end
    end
    
    

    그러면 다음과 같이 호출 할 수 있습니다

    v = VarGroup.new('test.txt')
    v.vars 
    #=> ["variable one", "I'm variable 2", 300, false, "I am variable 5"]
    (1..6).each do |n|
      p v.public_send("var#{n}")
    end
    # "variable one"
    # "I'm variable 2"
    # 300
    # false
    # "I am variable 5"
    # undefined method `var6' for #<VarGroup:0x000055a23e2f64e0>
    
    

관련 자료

  • 이전 deployment - Java XMPP 서버 응용 프로그램을 어디에 배포합니까?
  • 다음 python - 플라스크에 플래시 메시지가 나타나지 않음