2017-02-04 5 views
1

Ich versuche, ein Dataset zu lesen und in die Daten zu parsen, die ich brauche. Die Datei wird von Linien von Zeichenketten wie folgt zusammen:Analysieren eines Datasets in Ruby

id: 1234567 synset: test,exam 

Ich möchte dann die id Nummer erhalten und das synset Wort. Also in diesem Fall möchte ich 1234567 und test,exam

Hier ist, was ich habe, aber ich bin sicher, es gibt bessere Möglichkeiten.

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 

Antwort

1

Ihr Beispiel ist in Ordnung. Sie könnten split einmal mit dieser Syntax:

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

4 als zweiter Parameter wird für split wird sichergestellt, dass nouns ist nicht gespalten, wenn es Innenräume.

-1

Versuchen Sie mit JSON-Format in der Datei, es wird einfacher für Sie. Dann können Sie etwas tun:

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

Der Text, den er zeigte, ist nicht im JSON-Format. – trueinViso

+0

Sie können versuchen, die Zeilen basierend auf Leerzeichen aufzuteilen. 'line.split (" ")' Auf diese Weise erhalten Sie ein Array. – hvardhan

0

Wenn Sie große Dateien lesen wird, ist es besser, so etwas wie foreach zu verwenden, anstatt die gesamte Datei in den Speicher zu lesen:

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

Weitere Informationen finden Sie in diesem SO post gefunden werden. Die dritte Antwort diskutiert das "Schlürfen" einer Datei und warum es keine gute Idee ist.

Bearbeiten: JSON-Teil der Antwort entfernt.

+0

Ihnen mitzuteilen, ein anderes Dateiformat zu verwenden, ist keine nützliche Antwort. – akuhn

0

Verwenden Sie einen regulären Ausdruck

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

    puts id 
    puts nouns 

    # ... 

    end 
end