AutoLisp Öğreticisi #2- Dosya Kullanımı ve Harici Dosyalardan Veri Okuma

Harici dosyaları okumak ve yazmak, bunu yapmamış olan herkes için yıldırıcı görünebilir, ancak yıllar öncesinden bildiğim bir yöntem var.

Hem çok tutarlı hem de çok kolay bir yöntem. Hemen başlayalım.

Şiddetle önerdiğim ilk ipucu her zaman virgülle ayrılmış dosyaları kullanmaktır. Bunun arkasındaki neden şudur:

Şayet dosya uzantısı CSV ise, (örn. datafile.csv) Excel otomatik olarak bu dosya türünü açar.

çeviri kesinlikle mükemmeldir. Bu yüzden verilerinizi Excel’e girebilir ve daha sonra bir CSV dosyası olarak kaydedebilirsiniz.

Diğer formatlarla deney yaptım ve bu kullanım kolaylığı alkışlanmayı hak ediyor ve bizi kirli Autolisp kodundan kurtarırken; kodun çalışmasını da önemli ölçüde hızlandırıyor.

Virgülle Ayrılmış Dosya Nedir?

Çok basit bir şekilde, her satırda virgülle ayrılmış veri değerleri içeren bir ASCII dosyasıdır.

Virgül (,) sınırlayıcı olarak adlandırılır. Not Defteri’nde virgülle ayrılmış bir dosyayı açmanız aşağıdakine benzer şekilde görünecektir:

;========================================================================
;=  Function  PARSE_NUMS (string)
;=    Arguments: dizgesi – Metin dizgesi virgülle ayrılacak
;=    Geri dönüş:   Dizgenin elemanlarının sayılara döndürülmüş listesi
;=    Copyright Sertan Türkan 2003. Tüm hakları saklıdır.
;=    www.autocadbeyni.com
;===============================================================30/03/2003
(defun parse_nums (st / a k lst)
(setq k 1)
(setq a “”)
(setq lst nil)
(repeat (strlen st)
(if (= (substr st k 1) “,”)
(progn
(setq lst (append lst (list (atof a))))
(setq a “”)
)
(setq a (strcat a (substr st k 1)))
)
(setq k (+ k 1))
)
(setq lst (append lst (list (atof a))))
)

En, Yükseklik
4, 10
2, 8
3, 5
6, 12
EOF

Dizge değerlerinin, başında ve sonunda parantezler olması gerekmediğine dikkat edin. Gerekli olmasa da, neredeyse daima üzerine bana alt kısımda ne olduğunu söyleyen bir başlık gibi kullandığım “Genişlik, Yükseklik” gibi bir çizgi eklerim.

Her bir veri sütununun ne temsil ettiğini dosyanın içerisine girmek çok güzel bir alışkanlıktır; bana güvenin.

Ayrıca, veri dosyasının sonuna “EOF” yazan dosyanın sonuna ulaştığınızı belirten bir satır eklerim.

Bu Autolisp kodlamasını biraz daha kolaylaştırır.

Autolisp’e Hangi Dosyayı Okumak İstediğinizi Söyleme

İlk adım, Autolisp’e dosyayı açmasını ve dosyadan okumak veya dosyaya yazmak istediğinizi söylemektir.

Bunun temel sözdizimi şöyledir:

(setq f (open “SampleData.csv” “r“))

Yukarıdaki bu ifade tam anlamıyla okuma için, SampleData.csv dosyasını açar ve ve dosya adını f değişkene atar.

Dosya adını f değişkene atadık; böylece o dosya adını refere etmek için, bir yol bulmuş olduk. Örneğin, şayet okumak için bir dosya ve ayrıca veri yazmak için farklı bir dosya ihtiyacı duyarsak, Autolisp hangi dosyadan bahsettiğinizi tanımlamanın yolunu bulacaktır.

Dosyaya yazmak için, aşağıdaki ifadeyi kullanabiliriz:

(setq g (open “OutputData.csv” “w“))

Bu örnekte, f değişkenine atadığımız dosyadan okuyor ve verileri g değişkenine atadığımız dosyaya yazıyoruz.
*Not: Veri dosyasına bir yol adı belirtmeniz gerekecek ve Autolisp’de bunu yapmak biraz tuhaftır. Yolu belirttirken; aşağıdaki örnekte olduğu gibi tek bölü işareti (/) kullanmayı unutmayın. Böylece herhangi bir sorun yaşamayacaksınız.

(setq g (open “c:/test data/SampleData.csv” “r”))

Dosyadan Veri Nasıl Okunur

Artık iki Autolisp fonksiyonunu (açma) “(open)” ve (satır okuma) “(read-line)”  anladık; artık kodu oluşturmaya hazırız. Önce, başlık satırını okuduktan sonra okumanız (programa yardımcı olmadığı halde), daha sonra dosyayı sonuna kadar satır satır okuyan bir döngü kurmamız gerekecektir.

Yukarıdaki SampleData.csv veri dosyasını ve verilerini kullandığımızı varsayalım.

Bu dosyadaki veriler orijinin sol alt köşesine çizmek istediğimiz dört dikdörtgenin genişlik ve yükseklik değerlerinin bir listesi olsun.

İşe yeni yeni “new” komutu oluşturarak başlar; okumak için dosyayı açar ve ardından döngüyü aşağıdaki gibi ayarlarız:

(defun c:rects ()
(setq f (open “c:/test/sampledata.csv” “r“)) ;-Okumak için dosyayı açma
(setq dataline (read-line f))                ;-Başlıkları okuma
(setq dataline (read-line f))                ;-1. veri satırını okuma
(while (/= dataline “EOF”)                 ;-Dosyanın sonuna kadar döngü oluşturma
(setq dataline (read-line f))                ;-Sonraki veri satırını okuma
)
(close f)                                                   ;-Dosyayı kapatma
)

Dosyadan Bir Veri Satırı Okuma

Dosyadan verileri okumak için kullanacağımız komut, read-line Autolisp fonksiyonudur. Bu fonksiyonun

söz dizimi aşağıdaki gibidir:

(setq dataline (read-line f))

read-line fonksiyonu her çağrıldığında, o, veri dosyasından tek tek bir veri satırını okur ve dataline değişkenine kaydederek geri döndürür read-line fonksiyonu her çağırdığınızda kullandığınızda) f dosyasındaki bir sonraki veri satırı okur ve dataline değişkenine kaydeder.

Bu noktada verileri dosyadan satır satır okuyoruz. Ama bir problemimiz var. Her bir veri satırından virgülleri nasıl ayıracağız ve virgüllerden arındırılmış bir veri listesi oluşturacağız.

Neyse ki, yıllar önce bir Autolisp fonksiyonu yazmıştım; bu işi (virgülleri temizleme işini) sizin için otomatik olarak halledecektir. Fonksiyonun kodunu anlamanıza gerek yok;  sadece “rects” komut kodunun parantezleri içerisinde dosyanın sonundaki programa yapıştırın.

. Fonksiyonu kullanmak için, basitçe dataline değişkenine gönderin; fonksiyon dataline değişkenini nokta sayılarına dönüştürülmüş bir listede geri döndürecektir.

Autolisp Fonksiyonu: Virgül ile ayrılmış Dosyalardan Virgülleri Temizleme

Şimdi dosyadan virgülleri ayrıştırma sorunu için bir çözümümüz var; artık işimizi tamamlayalım. Sonraki görevimiz csv dosyasından noktaları elde etmek ve dikdörtgenleri çizmek. Böylece işimiz bitmiş olacak. İşte tamamlanmış Autolisp kodu:

(defun c:rects ()
(setq f (open “c:/test/sampledata.csv” “r”))  ;-Veri dosyasını açma
(setq dataline (read-line f))                 ;-Başlık satırını okuma
(setq dataline (read-line f))                 ;-Birinci veri satırını okuma
(while (/= dataline “EOF”)                    ;-Dosyanın sonuna dek döngü
(setq dataline (parse_nums dataline))       ;-Veri satırını ayrıştırma
(command “_rectangle” (list 0 0)dataline)   ;-Dikdörtgeni çizme
(setq dataline (read-line f))               ;-Sonraki veri satırını okuma
)
(close f)                                     ;-Dosyayı kapatma!!!
)

 

Hakkında Sertan Türkan

AutoCAD Beyni

Bunu da Kontrol edin

Revitte Filtreler Listesi

Revit’te çeşitli iletişim kutularında, kategorileri disipline göre filtrelemek için Filtre “Filter” listesini kullanabilirsiniz. Kategorilerini listelemek …

Bir cevap yazın

Yardıma mı ihtiyacınız var? Chat with us
Bir görüşme başlatmak için lütfen önce gizlilik politikamızı kabul edin.