2009-02-03 3 views
2

Je dois analyser un fichier texte délimité par des tabulations avec Ruby pour en extraire des données. Pour une raison inconnue, certaines colonnes ne sont pas utilisées et sont essentiellement des espaceurs; Je voudrais ignorer ces colonnes car je n'ai pas besoin de leur sortie (cependant je ne peux pas ignorer toutes les colonnes vides car certaines colonnes légitimes ont des valeurs vides). Je connais déjà les indices de ces colonnes (par exemple les colonnes 6, 14, 24 et 38). Bien que je puisse simplement ajouter un conditionnel pendant que j'analyse le fichier et disse analyser ceci à moins que ce ne soit une de ces colonnes, cela ne semble pas très "Rubyish" - y a-t-il une façon meilleure et plus élégante de gérer ce ? RegExps, peut-être? J'ai pensé à faire quelque chose comme [6, 14, 24, 38].each { |x| columns.delete_at(x) } pour supprimer les colonnes inutilisées, mais cela va me forcer à redéterminer les indices des colonnes dont j'ai réellement besoin. Ce que je voudrais vraiment faire, c'est faire une boucle sur l'ensemble, en vérifiant l'index de la colonne actuelle et l'ignorer si c'est l'un des "mauvais". Cependant, il semble très moche d'avoir le code comme unless x == 6 || x == 14 || x == 24 || x == 38Comment passer certaines colonnes lors de l'analyse d'un fichier texte avec Ruby?

+0

Notez que "[6, 14, 24, 38] .each {| x | columns.delete_at (x)}" se terminerait très mal pour vous. "[6, 14, 24, 38] .reverse_each {| x | columns.delete_at (x)}" a de meilleures chances. Voir pourquoi? –

Répondre

7

Pas besoin d'un conditionnel massif comme ça.

bad_cols = [6, 14, 24, 38] 
columns.each_with_index do |val,idx| 
    next if bad_cols.include? idx 
    #process the data 
end 
+0

Cool, j'avais lu à propos de each_index, je ne savais pas qu'il y avait aussi each_with_index. Merci!! –

+0

Je pense que ce que je devrais probablement faire au lieu d'extraire les données du fichier lui-même serait simplement de l'ouvrir et de supprimer les lignes dont je n'ai pas besoin; Je prévois de le charger dans une base de données de toute façon, mais je ne veux pas supprimer manuellement les lignes inutilisées chaque fois que je dois le charger. –

Questions connexes