2012-06-20 3 views
0

J'essaie de trouver la meilleure façon de tirer une valeur d'un fichier CSV appelé lookup.csv basé sur une valeur dans master.csv, puis enregistrez le nouveau fichier en tant que output.csv.Tirer une valeur d'un CSV basé sur une valeur dans un autre

Dans l'exemple ci-dessous, le fichier maître comporte trois colonnes de données, la dernière colonne étant City. Je voudrais remplacer le nom City par le City Code à partir du fichier lookup.csv.

Je n'ai pas de base de données que je puisse consulter, donc je dois utiliser le fichier CSV. J'essaie d'utiliser FasterCSV avec Ruby 1.8.7.

Exemple Structure du fichier:

master.csv:

First Name | Last Name | City 
Joey  | Jello  | Atlanta 
Home  | Boy  | Dallas 

lookup.csv:

City | City ID 
Atlanta | 12345 
Dallas | 12346 
Houston | 12347 

output.csv:

First Name | Last Name | City 
Joey  | Jello  | 12345 
Home  | Boy  | 12346 
+0

« Je n'ai pas un DB » Pourquoi ne pas regarder dans SQLite? Il est disponible pour presque tous les systèmes d'exploitation et idéal pour les bases de données temporaires et en mémoire. Cela simplifierait et accélérerait votre tâche. Chargez le CSV dedans, alors vous pouvez faire des accès aléatoires au lieu des lectures séquentielles de dossier. –

Répondre

1

J'utilise 1.9 , où FasterCSV est disponible en CSV dans la bibliothèque standard. D'abord, je crée une table de hachage de recherche sur lookup.csv:

cities = Hash[CSV.read('lookup.csv', :col_sep => ' | ').to_a[1..-1]] 

Si le fichier est très grand, vous pouvez itérer avec CSV.foreach et construire la ligne de hachage par ligne:

cities = {} 
CSV.foreach('lookup.csv', :col_sep => ' | ', :headers => true, :return_headers => false) do |line| 
    cities[line['City']] = line['City ID'] 
end 

puis itérer sur master.csv, faire une recherche de la ville dans le hachage et écrire que pour output.csv:

CSV.open('output.csv', "w", :headers => ['First Name', 'Last Name', 'City ID'], :write_headers => true) do |output| 
    CSV.foreach('master.csv', :col_sep => ' | ', :headers => true, :return_headers => false) do |line| 
    output << [line['First Name'], line['Last Name'], cities[line['City']]] 
    end 
end 
+0

Michael - Merci beaucoup pour l'exemple. Cela a fonctionné exactement comme j'avais besoin. – mpowmap

+0

Content de vous aider! Si vous voulez lancer un upvote en acceptant la réponse, j'aurais finalement ma réputation 20k ;-) –

Questions connexes