Csv dosyası içerisindeki belli bir satıra konumlanma

Katılım
25 Mayıs 2005
Mesajlar
44
Excel Vers. ve Dili
Excel 2007 - Türkçe
Herkese merhaba,

Benim sorum şu:
Önce yaptığım iş ile ilgili açıklama:
Çalıştığım şirketteki ürünlerin ürün ağaçlarını Excel'e indirip bunu csv dosyası olarak kayıt ediyorum. Yaklaşık 800 adet ürün var ve her bir ürünün ürün ağacı yaklaşık 1000 satırdan oluşuyor. Yani csv dosyası 800.000 satırlık bir dosya.

Excel'de bir hücreye yazdığım parça numarasının hangi mamül kodları içerisinde bulunduğunu toplu halde sorgulamak için aşağıdaki gibi bir yöntem ile csv dosyasını açtırarak parça numarasını her bir satırda tek tek aratıyorum.
Kod:
[FONT=Arial]Open "C:\csvdeneme.csv" For Input As 1[/FONT]
[FONT=Arial]   Do While Not EOF(1)[/FONT]
[FONT=Arial]       Line Input #1, kayit1[/FONT]
[FONT=Arial]       d0 = InStr(1, kayit1, maddekodu)[/FONT]
[FONT=Arial]       If d0>0 Then Cells(x,y) = "var"[/FONT]
[FONT=Arial]   Loop[/FONT]
[FONT=Arial]Close #1[/FONT]
Problemim:
Bu yöntem ile tüm satırlar tek tek taranmak zorunda olduğundan gereksiz yere çalışma süresi uzuyor.

Sorum:
Ben csv dosyası içerisindeki belli bir satıra (mesela 230.000 inci satıra) direk olarak nasıl gidebilirim.

Umarım sorum açık olmuştur, yardımcı olabilirseniz çok memnun olacağım.
 
Katılım
25 Mayıs 2005
Mesajlar
44
Excel Vers. ve Dili
Excel 2007 - Türkçe
Arkadaşlar,
Biraz araştırma yaptım, aşağıdaki kod ile belli bir sonuca ulaştım.
Kod:
[FONT=Arial]Open "C:\csvdeneme.csv" For Input As 1[/FONT]
[FONT=Arial] Do While Not EOF(1)[/FONT]
[FONT=Arial]     Seek #1,[[COLOR=red]csv dosyasında konumlanmak istediğim karakter numarası[/COLOR]][/FONT]
[FONT=Arial]     Line Input #1, kayit1[/FONT]
[FONT=Arial]     d0 = InStr(1, kayit1, maddekodu)[/FONT]
[FONT=Arial]     If d0>0 Then Cells(x,y) = "var"[/FONT]
[FONT=Arial] Loop[/FONT]
[FONT=Arial]Close #1[/FONT]
Ancak benim istediğim karakter numarasına değil de, csv dosyasındaki satır numarasına direk gidebilmek. Yani şöyle birşeyi yapabilseydim harika olacaktı:
Kod:
[FONT=Arial]Open "C:\csvdeneme.csv" For Input As 1[/FONT]
[FONT=Arial] Do While Not EOF(1)[/FONT]
[FONT=Arial]     Seek #1,[[COLOR=red]csv dosyasında konumlanmak istediğim ***SATIR*** numarası[/COLOR]][/FONT]
[FONT=Arial]     Line Input #1, kayit1[/FONT]
[FONT=Arial]     d0 = InStr(1, kayit1, maddekodu)[/FONT]
[FONT=Arial]     If d0>0 Then Cells(x,y) = "var"[/FONT]
[FONT=Arial] Loop[/FONT]
[FONT=Arial]Close #1[/FONT]
Yardımcı olabilirseniz çok memnun olurum.
 

halit3

Uzman
Uzman
Katılım
18 Ocak 2008
Mesajlar
12,852
Excel Vers. ve Dili
2003 excell türkçe
ve
2007 excell türkçe
Text dosya erişim kodları (okuma,yazma.vs) aşağıdaki linkleri inceleyiniz.

http://www.excel.web.tr/f48/text-import-son-10-kayyt-t87128.html
http://www.excel.web.tr/f48/txt-dosyasynyn-son-10-satyryny-kopyalamak-t61601.html

ayrıca bunlarada bir göz atın.

Kod:
Dosya Erişim Yöntemleri
Üç türlü dosya açma yöntemi vardır
Random ( Rastgele Erişimli ) Dosya
Sequential ( Sırasal Erişimli) Dosya
Binary ( Byte Erişimli ) Dosya
OPEN
Disk üzerinde dosya oluşturmak ve değişiklik yapmak için OPEN komutu kullanılır.
OPEN dosyaadı [FOR açma tipi] [ACCESS erişim tipi] [lock] AS [#]dosyanumarası [LEN=kayıt genişliği]
dosyaadı : "Sürücü : \ klasör\ dosyaadı" şeklinde açacağınız dosyayı tanımlayan metin
açma tipi : INPUT, OUTPUT, APPEND, RANDOM ya da BINARY tiplerinden biri
erişim tipi : Ağ ortamında dosyayı başkaları da açacaksa dosyaya erişim tipini belirleyebilirsiniz. READ(okuma), WRITE(yazma) veya READ WRITE (okuma ve yazma, RANDOM ve BINARY dosyalarda geçerlidir)
lock : dosya kilitleme
dosya numarası : açılan her dosyaya bir numara verilmelidir.
kayıt genişliği : Rasgele erişimli dosyalarda kayıt genişliğini belirtmek içindir.
Rastgele Erişimli Dosyaya Yazma Ve Okuma
Random veya Binary modu ile açılan dosyalara kayıtlar Put komutu ile yazılar ve Get komutu ile okunur.
Put [#] dosyano, [kayıtno], değişken
Get [#] dosyano, [kayıtno], değişken
Değişken: İçeriği yazılacak olan değişken, kaydın alınacağı değişken.
Dosyano: Yazılacak veya okunacak dosyanın numarası. Bu numara Open komutu ile belirlenen dosya numarasıdır.
Kayıtno: Yazılacak veya okunacak değişkenin dosya içindeki kayıt numarasıdır. Bu numara dosyadaki ilk kayıt için 1 ve olabilecek büyük değer 2,147,483,647 dir.
Dim x
x = “merhaba”
Put #1, 5, x
Yandaki satırlarla 1 numaralı dosyanın 5 numaralı kaydına x
değeri yazılmaktadır.
Dim x
Get #1, 5, x
MsgBox (x)
Yandaki satırda ise 1 numaralı dosyanın 5 numaralı kaydı
okunmaktadır.
Sıralı Erişimli Dosya Oluşturma ve Yazma
Sıralı erişimli dosya açmak istediğimizde bunu yalnızca OKUMA veya yalnızca YAZMA amaçlı olabilir. Dosya ne amaçla açılmışsa o amaçla kullanılır. Okumak için açtığımız dosyaya yazma yapamayız. Ancak dosya kapatıldıktan sonra yazma amaçlı olarak açıp yazdırabiliriz. Writ5e ve print komutuyla yazma yapılır.
Write # dosya no [ değişkenler]
Dosyano: Yazılacak dosya numarası. Bu numara Open komutu ile belirlenen dosya numarasıdır.
Değişkenler: Dosyaya yazılacak olan değişken listesi araya virgül konarak yazılar.
Open "c:\ORNEK\dosya.txt" For Output As #1
Bu yukarıdaki satırı açıklayalım. C: sürücüsü içinde ORNEK klasörü içine dosya.txt adında yeni bir dosya oluşur. OUTPUT (YAZMA amaçlı) olarak dosya oluşur, yani okuma amaçlı olarak kullanılamaz.
AS # 1 ise açtığımız dosyanın dosya numarasının 1 olduğunu belirtiyoruz. Bu numara dosya yazma ve okuma için kullanılacaktır. Başka dosya açacağımızda, eğer dosya kapatılmadıysa aynı numarayı kullanamayız.
WRITE komutu; verileri, arasına virgül koyarak dosyaya(yazma amaçlı açılan) yazar. PRINT komutunun ekrandaki etkisi ne ise aynen o şekilde dosyaya yazar. PRINT # de veriler arasına virgül , noktalı virgül , TAB SPC USING komutları da eklenebilir.
Close #1
Numarası belirtilen dosyayı kapatır. Bu satırı yazmasak da program çalışır ve hata vermez. Çünkü program sonlandığında programın açtığı tüm açık dosyalar kapatılır. Numara belirtilmezse tüm dosyalar kapatılır. Açık olan birden fazla dosyayı kapatmak için CLOSE #1,#3,#6 gibi bir komut kullanılabilir. Kapatılan dosya üzerinde işlem yapılamaz.
Sıralı Erişimli Dosyadan Okuma
Aşağıdaki programı yazıp çalıştırıldığında bu kodlar bir dosya oluşturacak
Open "c:\ORNEK\veriler.txt" For Output As #1
Write #1, "Mesut", "Akcan", 1968, "Adana"
Close #1
Üstteki programın oluşturduğu dosya üzerinde okuma işlemi yapılacak.
Open "c:\ORNEK\veriler.txt" For Input As #1
Dosyayı okuma amaçlı açacağımızı INPUT ekiyle belirtiyoruz. Eğer dosya yoksa File Not Found(Dosya bulunamadı) hatası oluşur
CLS:  Print A$, S$, DT%, DY$
Değişkenlere aktarılan değerler ekrana yazdırılıyor.
Close
Dosya(lar) kapanıyor.
Satır Satır Okuma
Daha çok düz metin içerikli dosyaları okumak için kullanılan bir yöntemdir. Dosya okuma amaçlı olarak açılır.
Kullanımı:
LINE INPUT # dosya numarası , String Değişken adı
Komut yürütüldüğünde dosyadaki ilk satırı komple okuyarak belirtilen değişkene aktarır. Aşağıdaki örneği inceleyiniz.
CLS:  dosya$ = "c:\bootlog.txt"
Open dosya$ For Input As #1
Print dosya$; " dosyası içeriği:"
Print "--------------"
Do While Not EOF(1)
A = A + 1
If A > 21 Then A = 0: Shell "pause"
Line Input #1, K$
Print K$
Loop
Dosyaya Ekleme Yapma
Open "c:\ORNEK\veriler.txt" For Append As #1
Daha önceden kayıtlı dosyaya yeni bilgiler eklemek gerekirse APPEND kullanılır. OUTPUT kullanılırsa eski bilgiler silinir.
Write #1, "Hande", "Özer", 1987, "İstanbul"
Close
Şimdi dosyadaki bilgileri okuyup ekrana yazalım
DefInt A-Z
NO = FREEFILE: CLS
Open "c:\ORNEK\veriler.txt" For Input As #NO
Do Until EOF(NO)
Input #NO, A$, S$, DT, DY$
Print A$, S$, DT, DY$
Loop
Seek #NO, 1
'baştan tekrar okunuyor
Print "-------------"
Input #NO, A$, S$, DT, DY$
Print A$, S$, DT, DY$
Close #NO
FREEFILE : Dosya numarası olarak kullanılmayan bir numara verir. Özellikle çok sayıda dosya açtığınızda hangi numaraların kullanıldığını bulmak zor olabilir. Bu durumlarda işe yarar bir komut.
EOF : Dosya sonu demektir(End Of File) Dosyadaki kayıtların bitip bitmediği bu komutla anlaşılır.
SEEK : Okumaya başlanacak konumu(byte) belirtir. Başlangıçta 1 dir. Bu komutu kullanmasaydık okuma konumu dosya sonuna geldiği için Input past end of file(Okuma dosya sonuna taştı) hatası çıkardı.
Okumaya başlanacak konumu(byte) belirtir. Başlangıçta 1 dir. Bu komutu kullanmasaydık okuma konumu dosya sonuna geldiği için Input past end of file(Okuma dosya sonuna taştı) hatası çıkardı.
Örnek Program:
5 Personeli olan bir kurumda personel kayıtları bir dosyaya aktarılacak. Aktarılacak bilgiler: Personelin; adı, soyadı, doğum yeri, yaşı, maaşı. Bilgiler klavyeden aktarılacak
DefInt A-Z: DefStr P: Dim m As Long
Open "c:\ornek\personel.txt" For Output As #1
For n = 1 To 10
CLS:  Print String$(40, "-")
Print n; ". personelin bilgilerini giriniz"
Print String$(40, "-")
INPUT "Adı"; pa
INPUT "Soyadı"; ps
INPUT "Doğum yeri"; pd
INPUT "Yaşı"; y
INPUT "Maaşı"; m
Write #1, pa, ps, pd, y, m
Next
Close
Print String$(40, "-")
Print "... işlem tamam ..."
Dosyaları Kapatmak
Hangi modla açılırsa açılsın dosya Close komutu ile numarası verilerek kapatılır.
Close # dosya [ ; # dosyano ] . . . .
Dosyano: Kapatılacak dosyanın numarası. Bu numara Open komutu ile belirlenen dosya numarasıdır.
Reset
Açık nolan bütün dosyaları ka*patmak için RESET komutu kullanılabilir.
Open “ dosya.dat ” for random as #1
…………………
………………...
Close #1

Binary Erişimli Dosya
İkili Erişimde dosya karşı tarafa kontrolü eksiksiz verir. Bu dosya sistemlerinin amacı model (örnek) yapamk değil, binary dosya yaratma veya erişim metodlarını tedarik etmektir.
Binary Erişimli Dosyayı Açmak
Binary erişimde dosya açma, kullanımını izlemek için Open (açmak) ifadesi kullanılır.
Open pathname For Binary As filenumber
Open (açmak) binary erişimde şu Len=reclength özelliğiyle değil, rastgele erişimli Open ile kullanılmaktadır.
Sequential Erişimli Dosya
Tavsiye edilen şu ki ; Dosya sistem hedefleri dosyada yazı oluşturmak için kullanılır, fakat bu metodlar dosyada daha büyük yazı oluşturmada kullanılan gerekli bilgileri tedarik etmekte.
Sequential erişim çalışmaları sadece en iyi dosyalara yazı gönderileceği zaman ihtiyaç duyulur.
Sequential’le erişebilmek tamamıyle çok uzun numaraların sırayla saklanmasıyla olur, çünkü her bir numara dizi karakterlerini saklamaktadır.
Sequential Erişimli Dosyayı Açmak
Sequential erişimde dosya açıldığı zaman, açmak için yerine getirilmesi gereken birkaç işlem izlenir :
· Input karakterlerinden itibaren dosya ( Input)
· Output karakterlaerinin dosyası (Output)
· Append karakterlerinin dosyası (Append)
Sequential erişimde dosya açmada, izlenecek açma ifadesinin kullanımı :
Open pathname For [ Input - Output – Append ] As filenumber [Len = buffersize]
Open kullanıldığı zaman Input dosyası zaten var olmakta ; başka türlü bir hata oluşmaktadır.
Open denendiği zaman varolmayan dosya Output veya Append ile beraber, Open ifadesiyle yaratılan birinci dosya ve ondan sonra açılanlar gelir
 
Katılım
25 Mayıs 2005
Mesajlar
44
Excel Vers. ve Dili
Excel 2007 - Türkçe
Çok teşekkür ederim.
Seek fonksiyonu ile ilgili daha detaylı bilgiyi nereden bulabilirim acaba ?
 
Üst