Skip to content

Instantly share code, notes, and snippets.

@roktas
Forked from gdemir/csv.rb
Created October 23, 2010 11:14
Show Gist options
  • Save roktas/642092 to your computer and use it in GitHub Desktop.
Save roktas/642092 to your computer and use it in GitHub Desktop.
#!/usr/bin/ruby
require 'csv'
##[global]#############################################################
$kisiler = {} #db.csv'den okunan bilgilerin tutuldugu sozluk
$csvname = "db.csv" #okunacak db'nin adı.
$kafa = [] #csv dosyasının ilk satırı.(örn : ["ad", "soyad", "no"])
$key = "no" #herhangi bir csv de key olarak seçeceginiz ifade.
$value = [] #$kafa'nın keysiz hali.(örn : ["ad", "soyad"])
#######################################################################
#
#
# csv'de alanlar "ad", "sd" ,"no", "un" olsun.
# global olarak $key = "no" seçerseniz, yükleme sırasında
# kisiler = {
# no => { "ad" => "gokhan", "sd" => "demir", "un" => "gdemir"},
# no => { "ad" => "emin", "sd" => "eker", "un" => "eeker" },
# }
#
# ve $kafa = ["no", "ad", "sd", "un"], $value = ["ad", "sd", "un" ]olacak,
#
# şekilde yükleyecektir.Örneğin csv'de gokhanın no'su "12345" olsun.
#
# ÖRNEK[1] : ogrenci = $kisiler["12345"] denirse,
# print ogrenci --> {"ad" => "gokhan", "sd" => "demir", "un" => "gdemir"} döner.
#
# ÖRNEK[2] : ogrenci = $kisiler["12345"]
# print ogrenci["ad"] --> "gokhan" döner.
#
# ÖRNEK[3] : for no in $kisiler.keys
# print $kisiler[no]["ad"] --> "gokhan", "emin" döner.
#
# ÖRNEK CSV :
# no, ad , sd, un
# 1,emin,eker,,
# 2,emre,yılmaz,,
#
def _values(kisi, key_indis, sozluk)
$kafa.each_index{ |indis|
alan = $kafa[indis]
sozluk[alan] = kisi[indis] if indis != key_indis
}
sozluk
end
def yukle
oku = CSV.open($csvname, "r")
$kafa = oku.shift # ["no","ad","sd","un"]
*$value = *$kafa
key_indis = $kafa.index($key)
$value.delete($key) # ["ad", "sd", "un"]
oku.each { |kisi|
$kisiler[kisi[key_indis]] = _values(kisi, key_indis, {})
}
end
def bosalt
CSV::Writer.generate(File.open($csvname, "w")) do |csv|
csv << $kafa
$kisiler.each do |no, value|
yaz = []
yaz << no
$value.each { |v| yaz << value[v]}
csv << yaz
end
end
end
### DEMO
yukle
$kisiler.each { |no| puts no + " : " + $kisiler[no] }
bosalt
#!/usr/bin/ruby
# XXX Ruby'nin özelliklerini tanımak için yazılan deneysel bir koddur
# XXX Sorgulamadan örnek almayın!
require 'csv'
def die(*message)
$stderr.puts(*message)
exit 1
end
class Kisi
attr_accessor :no, :ad, :sd, :un
def initialize(kayit)
# verilen kayıt sözlüğünden ayrı ayrı atama yapmak yerine class içinde
# tanımlı sembollere bakarak sözlüğü olduğu gibi aktarmaya çalışıyoruz
kayit.each do |k, v|
eval <<-EOS
@#{k} = v unless defined? @#{k}
EOS
end
end
def bas
puts "No: #{self.no}"
puts "Ad: #{self.ad}"
puts "Soyad: #{self.sd}"
puts
end
end
class Topluluk
def initialize(csv, gore="no")
@topluluk = {}
@gore = gore
begin
oku = CSV.open(csv, "r")
rescue Exception => e
die "CSV dosya okunurken hata: #{e}"
end
@kafa = oku.shift
# bir şablon oluşturalım, tüm kayıtlar bunun gibi olmalı
bunungibi = Hash[*@kafa.map { |elt| [elt.to_sym, nil] }.flatten]
oku.each do |kisi|
# şablondan çoğalt
kayit = bunungibi.clone
# csv satırda her alanı kafadki sırayla al
@kafa.each { |alan| kayit[alan.to_sym] = kisi.shift }
# artık bir nesne oluşturup ekleyebiliriz
@topluluk[kayit[gore.to_sym]] = Kisi.new kayit
end
end
# basma görevini ilgili nesneye paslıyoruz, başka bir görevimiz yok
def bas(hangi)
if hangi
# anahtar verilmişse sadece ilgili kişi
kisi = @topluluk[hangi]
kisi.bas if kisi
else
# aksi taktirde hepsi
@topluluk.each do |gore, kisi|
kisi.bas
end
end
end
end
csv = ARGV.shift or die "Kullanım: #{$0} <csvdosya>"
FileTest.exists? csv or die "Dosya #{csv} bulunamadı"
topluluk = Topluluk.new(csv).bas ARGV.shift
no ad sd un
10060264 zinnur yeşilyurt
10060265 baki savaş
10060266 kamer kevser bağlı
10060267 gökhan ceylan
10060268 emre çavuş
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment