Skip to content

Instantly share code, notes, and snippets.

@gdemir
Forked from roktas/csv.rb
Created October 23, 2010 20:03
Show Gist options
  • Save gdemir/642630 to your computer and use it in GitHub Desktop.
Save gdemir/642630 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
#!/usr/bin/ruby
require 'csv'
def die(*msg)
$stderr.puts(*msg)
exit 1
end
class Unit
def ac(type, csv, islem)
begin
fp = type.open(csv, islem)
rescue Exception => e
die "CSV dosya okuma veya yazmada hata: #{e}"
end
return fp
end
end
class Yukle < Unit
attr_accessor :kisiler, :kafa
def initialize(csv, gore = "no")
self.kisiler = {}
@gore = gore
oku = ac(CSV, csv, "r")
self.kafa = oku.shift
# bir şablon oluşturalım, tüm kayıtlar bunun gibi olmalı
bunungibi = Hash[*self.kafa.map { |alan| [alan.to_sym, nil] }.flatten]
oku.each do |kisi|
# şablondan çoğalt
kayit = bunungibi.clone
# csv satırda her alanı kafadaki sırayla al
self.kafa.each { |alan| kayit[alan.to_sym] = kisi.shift }
# artık bir nesne oluşturup ekleyebiliriz
self.kisiler[kayit[@gore.to_sym]] = kayit
end
end
end
class Bosalt < Unit
def initialize(c, csv)
yaz = ac(File, csv, "w")
CSV::Writer.generate(yaz) do |row|
# csvnin ilk satırına kafa bilgisini ekle
row << c.kafa
# kisilerden her kisinin bilgilerini temp'e doldur sonra satıra ekle
c.kisiler.each do |no, kisi|
temp = []
c.kafa.each { |alan| temp << kisi[alan.to_sym]}
row << temp
end
end
end
end
csv = ARGV.shift or die "Kullanım: #{$0} <csvdosya>"
FileTest.exists? csv or die "Dosya #{csv} bulunamadı"
#demo
c2010 = Yukle.new(csv)
c2010.kisiler.each do |no, kisi|
puts kisi[:no] + " | " + kisi[:ad] + " | " + kisi[:sd]
end
Bosalt.new(c2010, csv)
no ad sd un
10060268 emre çavuş
10060264 zinnur yeşilyurt
10060265 baki savaş
10060266 kamer kevser bağlı
10060267 gökhan ceylan
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment