2017-02-04 1 views
1

데이터 집합을 읽고 필요한 데이터로 구문 분석하려고합니다. 파일은 다음과 같은 문자열의 라인으로 구성된다 :Ruby에서 데이터 집합 파싱

id: 1234567 synset: test,exam 

내가 다음 id 번호와 synset 단어를 가져올. 따라서이 경우 원하는 내용은 1234567test,exam

여기 나와 있습니다.하지만 더 좋은 방법이있을 것입니다.

File.open(synsets_file, "r") do |f| 
    f.each_line do |line| 
     id = line.split[1].to_i 
     nouns = line.split[3] 
     #do things with id and nouns 
    end 
end 

답변

1

귀하의 예는 괜찮습니다. 이 구문을 사용하여 한 번 split을 사용할 수

File.foreach(synsets_file) do |line| 
    _, id, _, nouns = line.chomp.split(/\s+/, 4) 
    # do things with id and nouns 
end 

공간이 내부에있는 경우 nouns 분할되지 않도록합니다 split에 대한 두 번째 매개 변수로 4 사용.

-1

파일에서 JSON 형식을 사용해보세요. 더 쉽게 할 수 있습니다. 용량이 큰 파일을 읽을 수 경우 대신 메모리에 전체 파일을 읽는 foreach 같은 것을 사용하는 것이 좋습니다

require 'json' 
file = File.read('file-name-to-be-read.json') 
data_hash = JSON.parse(file) 
puts data_hash['id'] // gives 1234567 
+1

그가 보여 준 텍스트는 json 형식이 아닙니다. – trueinViso

+0

공백을 기준으로 줄을 분할 할 수 있습니다. 'line.split ("")'이렇게하면 배열을 얻을 수 있습니다. – hvardhan

0

:

File.foreach(sunset_file) do |l| 
    id = l.split[1].to_i 
    nouns = l.split[3] 
    #do things with id and nouns 
end 

더 많은 정보를 수있는 그런 다음, 당신은 이런 식으로 뭔가를 할 수 있습니다 이 SO post에 있습니다. 세 번째 대답은 파일을 "slurping"하고 왜 좋은 생각이 아닌지에 대해 설명합니다.

편집 : 답변의 JSON 부분이 삭제되었습니다.

+0

다른 파일 형식을 사용하도록 알려주는 것은 유용한 대답이 아닙니다. – akuhn

0

를 사용하여 정규 표현식

File.open(synsets_file, "r") do |f| 
    f.each_line do |line| 
     /^id: (?<id>.*) synset: (?<nouns>.*)/ =~ line.chomp 

    puts id 
    puts nouns 

    # ... 

    end 
end