2010-11-19 7 views
1

Je suis actuellement ceci:En utilisant Ruby fastercsv, veulent briser mes fichiers par 1000 lignes

users = User.all() 

users.each do |u| 

csv << ..... 

end 

Mais mon dossier est une façon de grand, je veux rompre dehors dans 1K lignes par fichier, nommez le fichier comme:

users_1-1000.csv users_1001-2000.csv .etc.

Comment puis-je faire cela, je ne veux pas gâcher avec des erreurs off-by-one non plus!

Répondre

0

Utilisez la méthode de limite et de décalage de AR. Et changez le décalage chaque fois que vous générez un fichier.

0

Vous pouvez faire quelque chose comme ceci:

users = User.all 

users.each_with_index do |u, i| 
    csv << ... 
end 

et vous utiliser l'index pour savoir quand il est temps de passer à un nouveau fichier.

(i % 1000) == 0 #Open new file 
(i % 1000) == 999 #Close existing file 
3

find_in_batches est parfait pour cela. Par défaut, find_in_batches utilise un :batch_size de 1000, de sorte que votre code ressemble à ceci:

count = 1 
User.find_in_batches do |users| 
    FasterCSV.open("filename-#{count}.csv",'w') do |csv| 
    users.each { |u| csv << ... } 
    count += 1 
    end 
end 
Questions connexes