Dış veri alma işlemlerinin otomatikleştirilmesi

Katılım
30 Ocak 2006
Mesajlar
937
Excel Vers. ve Dili
Access 2003
Arkadaşlar.. Hazırladığım bir program için .txt uzantılı $ ile ayrılmış verileri access'e almam gerekiyor. Bir başka programla oluşturulmuş bu veriler metin belgesi olarak .txt uzantılı kaydedilmiş. Her bir veri arasında $ işareti mevcut ve böylece $ ayıraçlı olarak verileri sorunsuz olarak alabiliyoruz. Ama bu veri yapısı her birim için farklı farklı uzantıya sahip. Yapıları tamamen aynı. Verilerin alma işlemini tamamen otomatik yapmamız gerekiyor. Yani kullanıcı verileri gözat düğmesi gibi bir düğme ile seçecek ve verileri aktar diyecek. Bunun dışında herhangi bir işlem yapmayacak. Alınacak veriler access'teki bir tablo yapısı içerisine gelecek ve daha sonra veriler üzerinde bazı değişimler yapacak. İşi tamamlandığında da işlem tersine işleyecek ve verileri tekrar bir metin dosyası şeklinde ve yine aynı yapı şeklinde -yani $ ayıraçlı olarak- dışa gönderecek.

Bu işlemleri ben elimle yapabiliyorum. Nasıl yapıyorum? Şöyle.. Access'i açıp tablo al komutunu çalıştırıp tablo türü olarak metin dosyasını seçiyorum ve txt uzantılı dosyayı gösteriyorum. Access bana nereye alayım diye soruyor. Yeni bir tabloya oluştur, oraya al diyorum. Yapı içerisinde metin belgesinin verilerinin $ ile ayrıldığını gösteriyorum. Bu arada yazı karakterlerinde Türkçe karakterlerde sorun oluştuğu için kodlama dilini de Gelişmişe basıp windows Türkçesi olarak değiştiriyorum. Bu arada alan23 diye bir alanın verilerinde tutarsızlık oluştuğu için onun sayı olarak gelen özelliğini de metin olarak değiştiriyorum. Ve verileri almaya başlıyorum. Verirken de aynı işlemlerin tersini yapıyorum.


Şimdi, bu işlemleri işi bilmeyen bir kullanıcı için nasıl otomatiğe bağlarım?. Asıl sorun bu. Ayrıca gelen dosyalar farklı uzunluklarda her mahalle için farklı adlarda gelecek. Yani A mahallesinin dosyasını seçip bu işlemler yapılıp bitince B mahallesinin işlemlerine başlayacak. Dosyaları da manuel seçmemiz gerekiyor yani..


Bu konuda fikri olan arkadaşlar aranıyor:))))
 
Katılım
25 Aralık 2005
Mesajlar
4,160
Excel Vers. ve Dili
MS Office 2010 Pro Türkçe
Sayın mehmetdemiral,

Sayın karaayhana yardım etmiştim. Modüle bir fonksiyon yazarsınız. Değişkeni seçeceğiniz dosyanın tam yolu olur. O fonksiyon içinde de istediğiniz değişiklikler yapılıp geçici bir tabloya kaydedilecek. Sonra o tablodan veriler teker teker alınıp dıştaki text dosyasına kaydedilecek.

Bir örnek üstünde çalışmak daha iyi.

İyi çalışmalar
 
Katılım
30 Ocak 2006
Mesajlar
937
Excel Vers. ve Dili
Access 2003
Sayın modalı kutluyorum.. Bu kadar olur yani.. Böylesi bir txt dosyasından hatasız veri almak bile mümkünmüş demekki.. Benim örneğimdeki txt dosyası karaayhan'ın kaynak dosyasının yanında zemzem suyuyla yıkanmış sayılır:))) Demek istiyorum ki, benim dosyamda veriler $ ile birbirinden ayrılmış. O yüzden alanlar belli bir sayıda değil. Yani sizin örneğinizde alanlar arası sanıyorum tab sekmesi ile ayrılmış. Oysa benim örneğimde $ ile ayrıldığı için alanlar belli noktalarda başlayıp bitmiyor. Mesela bir sayaç no alanı var, bazısında 3 karakter bazısında ise 8 karakter gibi.. İşin doğrusu kaynakların yapıları çok farklı gibi geldi bana.. O yüzden kafam iyice karıştı. Ben bu çevirme işleminde de kendi dosya örneğimi göndererek yine yardım talep edeceğim sizden. Bu arada rar dosyam içinde bir de excel örneği var. O da örnek olarak "işte madde başlıkları bu şekilde olacak" denilerek bana verildi. Yani sütun başlıkları orada yazılı. Çünkü orijinal txt dosyasında sütun başlıkları yok. Yanlış anlaşılmasın yani excele göre falan yapmayacağım. Access'te formunu falan oluşturuyorum şu anda ama verileri manuel alıyorum. Sizin kodları deneyip: "dosya bulunamadı göstermek ister misiniz?" diye sorması ve gösterdiğim dosyanın da adının "kaynak" olmamasına bakmaması süper işime yarıyor. Çünkü kurumdan gelen txt dosyalarının orijinal adları
4ac91038-5a7b-4623-a1ff-eb16123e2fa9AboneBilgileri.txt

falan biçiminde... Fakat benim dosyamın içeriğini kodlara nasıl uygularım veya nereleri değiştirmem gerek anlayamadım. Zamanınız olursa yardım eder misiniz?.. Selamlar..
 
Katılım
15 Kasım 2006
Mesajlar
583
Excel Vers. ve Dili
Ms Office 2003 Türkçe
Sayın Mehmet Demiral, split deyimini inceleyiniz.
 
Katılım
30 Ocak 2006
Mesajlar
937
Excel Vers. ve Dili
Access 2003
Sevgili yeni54
mid komutunun yerine kullanmak için mi?

Sanırım şöyleymiş

kelime = split(cumle, "$" )
 
Son düzenleme:
Katılım
15 Kasım 2006
Mesajlar
583
Excel Vers. ve Dili
Ms Office 2003 Türkçe
Küçük bir örnek vereyim, sizi kendi programınıza uyarlayın.

Kod:
okunanCumle="qqqq$www$eee$rrr$ttt" ' olsun
strArray = split(okunanCumle,"$")
for i=0 to Ubound(strArray)
    msgbox strArray(i)
next i
 
Katılım
30 Ocak 2006
Mesajlar
937
Excel Vers. ve Dili
Access 2003
Sayın Yeni54.... Bunu modalı'nın örneğine nasıl uygulayacağımı çok anladığımı söyleyemeyeceğim. Mümkünse örnek üzerinde gösterir misiniz?

Veri al komut düğmesinde şu kodlar varmış:


Sub OpenTextFileTest()
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim fs, f
Dim name, name1, text, path As String
Dim txtLen, adetYıldız, adetTarih As Long
Dim cnn As New ADODB.Connection
Dim rst As New Recordset
Dim fileName As String
Dim result As Integer
'On Error GoTo Çıkış
On Error GoTo Err

path = CurrentProject.path
name = path & "\kaynak"
'name1 = "kaynak"

strFilePath = fReturnFilePath("kaynak", CurrentProject.path)

If strFilePath <> name Then
Response = MsgBox("Dosya bulunamad&#305; yerini belirtmek ister misiniz?", vbYesNo, "UYARI")
If Response = 7 Then
Exit Sub
End If
name = getFileName

Response = MsgBox("Dosya bulundu verileri y&#252;klemek ister misiniz?", vbYesNo, "UYARI")
If Response = 7 Then
Exit Sub
Else

Set fs = CreateObject("Scripting.FileSystemObject")

Set f = fs.OpenTextFile(name, 1, -2)
'f.Visible = False

text = f.ReadAll

End If
End If

Set fs = CreateObject("Scripting.FileSystemObject")

Set f = fs.OpenTextFile(name, 1, -2)
'cnn yi mevcut vt ba&#287;lant&#305;s&#305; olarak ayarl&#305;yoruz
'rst olarak cnn ba&#287;lant&#305;s&#305;nda bulunan tblAl&#305;nan Veriler tablosunu ekleme yapmak &#252;zere
'a&#231;&#305;yoruz.

Set cnn = CurrentProject.Connection
rst.Open "tblAl&#305;nanVeriler", cnn, adOpenKeyset, adLockOptimistic, adCmdTableDirect

'f dosyas&#305;n&#305;n sonu gelene kadar &#231;evrimi &#231;al&#305;&#351;t&#305;r&#305;yoruz(bug&#252;n AtEndofStream i ar&#305;yordum)

Do While f.AtEndofStream <> True

'text de&#287;i&#351;kenine f deki sat&#305;rlar&#305; okuyup metni atamas&#305;n&#305; sa&#287;l&#305;yoruz

text = f.readLine

'E&#287;er text de&#287;i&#351;keninin ilk karakteri * ise

If Mid(text, 1, 1) = "*" Then

'rst kay&#305;t k&#252;mesine yeni bir kay&#305;t ekliyoruz parantez i&#231;ine
'0 ba&#351;layarak alan indexlerini veya adlar&#305;n&#305; yazabiliyoruz
'Trim le ald&#305;&#287;&#305;m&#305;z metnin sa&#287; ve solundaki bo&#351;luklar&#305; temizliyoruz
'Mid ile ilk s&#305;rada text metninin 2. karakterinden ba&#351;lamak &#252;zere 6 karakter se&#231;iyoruz
'Burada dikkat edilecek konu, metin dosyas&#305; yaz&#305;l&#305;rken kay&#305;tlar aras&#305;nda
'bo&#351;luk b&#305;rak&#305;ld&#305; bunlar&#305; da g&#246;z &#246;n&#252;ne almak gerekiyor. Ben kaynak dosyas&#305;n&#305; notpad de a&#231;&#305;p
'oradan sayarak buldum say&#305;lar&#305;. Ve ad&#305;m ad&#305;m ilerliyerek
'&#304;leti kutusuyla verileri teker teker kontrol ettim

rst.AddNew
rst("S&#305;ra") = Trim(Mid(text, 2, 6))
rst("Do&#287;umTarihi") = Trim(Mid(text, 8, 4))
rst("K&#252;t&#252;kNo") = Trim(Mid(text, 13, 4))
rst("TCKimlikNo") = Trim(Mid(text, 18, 11))
rst("Durumu") = Trim(Mid(text, 30, 120))
rst("Soyad&#305;") = Trim(Mid(text, 151, 50))
rst("Ad&#305;") = Trim(Mid(text, 202, 50))
rst("Di&#287;erAd&#305;") = Trim(Mid(text, 253, 50))
rst("BabaAd&#305;") = Trim(Mid(text, 304, 50))
rst("Di&#287;erBabaAd&#305;") = Trim(Mid(text, 355, 50))
rst("AnaAd&#305;") = Trim(Mid(text, 407, 50))
rst("Di&#287;erAnaAd&#305;") = Trim(Mid(text, 457, 50))
rst("K&#246;y/Mahalle") = Trim(Mid(text, 509, 50))
rst("AileS&#305;raNo") = Trim(Mid(text, 560, 2))
rst("CiiltNo") = Trim(Mid(text, 563, 12))
rst("SayfaNo") = Trim(Mid(text, 576, 2))
rst("N&#252;fusKay&#305;t&#304;li") = Trim(Mid(text, 579, 50))
rst.Update
End If

Loop

'f metin dosyas&#305;n&#305; kapat&#305;yoruz
f.Close

'&#304;lerde hatalar&#305;n &#246;n&#252;ne ge&#231;mek i&#231;in mutlaka i&#351;in sonunda
't&#252;m ayarlar&#305; hi&#231;bir&#351;ey ile e&#351;itlememiz gerekiyor

Set f = Nothing
Set fs = Nothing
Set rst = Nothing
Set cnn = Nothing
Err:
If Err.Number = 62 Then
MsgBox "Belirtti&#287;iniz dosya bo&#351;", vbOKOnly, "UYARI"
Else
'MsgBox Err.Number
End If
Exit Sub
&#199;&#305;k&#305;&#351;:

'DoCmd.Quit
End Sub




San&#305;r&#305;m &#246;zellikle &#351;u kodlar&#305;n yenileriyle de&#287;i&#351;mesi laz&#305;m ama nas&#305;l?

rst.AddNew
rst("S&#305;ra") = Trim(Mid(text, 2, 6))
rst("Do&#287;umTarihi") = Trim(Mid(text, 8, 4))
rst("K&#252;t&#252;kNo") = Trim(Mid(text, 13, 4))
rst("TCKimlikNo") = Trim(Mid(text, 18, 11))
rst("Durumu") = Trim(Mid(text, 30, 120))
rst("Soyad&#305;") = Trim(Mid(text, 151, 50))
rst("Ad&#305;") = Trim(Mid(text, 202, 50))
rst("Di&#287;erAd&#305;") = Trim(Mid(text, 253, 50))
rst("BabaAd&#305;") = Trim(Mid(text, 304, 50))
rst("Di&#287;erBabaAd&#305;") = Trim(Mid(text, 355, 50))
rst("AnaAd&#305;") = Trim(Mid(text, 407, 50))
rst("Di&#287;erAnaAd&#305;") = Trim(Mid(text, 457, 50))
rst("K&#246;y/Mahalle") = Trim(Mid(text, 509, 50))
rst("AileS&#305;raNo") = Trim(Mid(text, 560, 2))
rst("CiiltNo") = Trim(Mid(text, 563, 12))
rst("SayfaNo") = Trim(Mid(text, 576, 2))
rst("N&#252;fusKay&#305;t&#304;li") = Trim(Mid(text, 579, 50))
rst.Update
End If
 
Katılım
30 Ocak 2006
Mesajlar
937
Excel Vers. ve Dili
Access 2003
Vb kodlar&#305; konusunda eksiklerim &#231;ok. Daha &#231;ok ana komutlar&#305; biliyorum. Onlar&#305; da &#246;rnekler &#252;zerinde uygulayarak falan &#246;&#287;rendim. Bu da bahsetti&#287;im i&#351;leri olduk&#231;a zor hale getiriyor benim i&#231;in. Bazen diyorum ya, modal&#305;, yeni54 ve beab05 i&#231;in 3 sat&#305;rl&#305;k kodla yap&#305;lacak i&#351;leri ben 8 tane sorgu, 12 tane makro, 24 tane de tablo ile yapabiliyorum. Visual (G&#246;rsel) programlama benim yapt&#305;&#287;&#305;m olsa gerek :))))
 
Katılım
15 Kasım 2006
Mesajlar
583
Excel Vers. ve Dili
Ms Office 2003 Türkçe
text = f.readLine
sat&#305;r&#305;na kadar ayn&#305; oldu&#287;unu kab&#252;l edelim. (buradaki text &#246;rne&#287;imizdeki okunan c&#252;mle oluyor)
strArray = split(text,"$")
rst.AddNew
rst("Telefon_No") = strArray(0)
rst("Cep_Telefon_No") = strArray(1)
....
rst.update

Burada k&#305;rm&#305;z&#305; ile yaz&#305;l&#305; olanlar, sizin tablonuzun alanlar&#305; olacak.
 
Katılım
30 Ocak 2006
Mesajlar
937
Excel Vers. ve Dili
Access 2003
&#199;ok sa&#287;ol yeni54... Deneyece&#287;im yar&#305;n. &#199;&#252;nk&#252; sabah 5.30'da kalkmam laz&#305;m. Yar&#305;n okul var. 6.15'de servis... Birazdan yatar&#305;m art&#305;k. Hemen denemem m&#252;mk&#252;n de&#287;il &#231;&#252;nk&#252; b&#252;t&#252;n alan adlar&#305;n&#305; benim &#246;rne&#287;ime uydurmam veya karaayhan'&#305;n txt tablosunu benim $ seperatorlu hale benzetmem laz&#305;m. Art&#305;k yar&#305;n in&#351;allah.... &#199;ok te&#351;ekk&#252;rler... Siz de olmasan&#305;z.....
 
Katılım
30 Ocak 2006
Mesajlar
937
Excel Vers. ve Dili
Access 2003
Bu arada t&#252;m bunlar i&#231;e aktar&#305;m i&#231;in. Modal&#305;'n&#305;n dedi&#287;i gibi bunlar&#305; daha sonra tekrar txt olarak d&#305;&#351;a aktarmak i&#231;in bu yol tersine nas&#305;l &#231;al&#305;&#351;acak?
 
Katılım
30 Ocak 2006
Mesajlar
937
Excel Vers. ve Dili
Access 2003
Biz de i&#231;e aktard&#305;k da neleri d&#252;&#351;&#252;nmeye ba&#351;lad&#305;k. :))
 
Katılım
30 Ocak 2006
Mesajlar
937
Excel Vers. ve Dili
Access 2003
Sayın yeni54
Yine de dayanamadım ve işi hızlandırmak için karaayhan'ın verilerini $ aralıklı olarak düzenledim (Sadece bir cümlesini).. Modalı'nın veri al düğme yordamındaki kodlarını da sizin belirttiğiniz gibi düzenledim. Şöyle:



text = f.readLine

'Eğer text değişkeninin ilk karakteri * ise

'If Mid(text, 1, 1) = "$" Then

'rst kayıt kümesine yeni bir kayıt ekliyoruz parantez içine
'0 başlayarak alan indexlerini veya adlarını yazabiliyoruz
'Trim le aldığımız metnin sağ ve solundaki boşlukları temizliyoruz
'Mid ile ilk sırada text metninin 2. karakterinden başlamak üzere 6 karakter seçiyoruz
'Burada dikkat edilecek konu, metin dosyası yazılırken kayıtlar arasında
'boşluk bırakıldı bunları da göz önüne almak gerekiyor. Ben kaynak dosyasını notpad de açıp
'oradan sayarak buldum sayıları. Ve adım adım ilerliyerek
'İleti kutusuyla verileri teker teker kontrol ettim


strArray = Split(text, "$")
rst.AddNew
rst("Sıra") = strArray(0)
rst("DoğumTarihi") = strArray(1)
rst("KütükNo") = strArray(2)
rst("TCKimlikNo") = strArray(3)
rst("Durumu") = strArray(4)
rst("Soyadı") = strArray(5)
rst("Adı") = strArray(6)
rst("DiğerAdı") = strArray(7)
rst("BabaAdı") = strArray(8)
rst("DiğerBabaAdı") = strArray(9)
rst("AnaAdı") = strArray(10)
rst("DiğerAnaAdı") = strArray(11)
rst("Köy/Mahalle") = strArray(12)
rst("AileSıraNo") = strArray(13)
rst("CiiltNo") = strArray(14)
rst("SayfaNo") = strArray(15)
rst("NüfusKayıtİli") = strArray(16)
rst.Update
'End If



Fakat sonuç alamadım. StrArray ifadesinden sonraki parantez içi sayıları acaba bir yerlerde düzenleme yapmamı mı gerektiriyor. Bu yapıya göre onlar $ işaretlerini saymıyor mu? Ben öyle düşündüm. Fakat veri al deyip tabloyu göstermeme rağmen dosyayı gösterip tamam dediğimde program kitlenip kalıyor. Herhangi bir mesaj veya hata vermiyor. Çalışmayı olduğu gibi ekliyorum. Bir de siz deneyin nerde hata yaptım?..
 
Katılım
30 Ocak 2006
Mesajlar
937
Excel Vers. ve Dili
Access 2003
Neyse hallettim.. Verilerin tam 16 adet $ i&#231;ermesi gerekiyormu&#351;. Ben ba&#351;taki $'&#305; silince sonda da olmay&#305;nca &#231;al&#305;&#351;t&#305;. &#199;ok te&#351;ekk&#252;rler sevgili yeni54, modal&#305; ve karaayhan.. &#199;ok b&#252;y&#252;k bir yard&#305;m ettiniz bana &#252;&#231;&#252;n&#252;z de..&#350;imdi alan adlar&#305;n&#305; da d&#252;zenlersem herhalde bu i&#351; ok. Bir de geri y&#252;kleme kafamda soru i&#351;areti. Bakal&#305;m ona da s&#305;ra gelince yard&#305;mlar&#305;n&#305;z&#305; isterim yine:))) Asl&#305;nda form &#252;zerinde Veri ekle tu&#351;uyla san&#305;r&#305;m modal&#305; yap&#305;lan de&#287;i&#351;iklikleri kaynak dosyaya yazd&#305;rmak istemi&#351;, fakat dosya ad&#305; "kaynak" olmay&#305;nca -hem de uzant&#305;s&#305;z olmal&#305;, txt falan de&#287;il- kendisi o klas&#246;re "kaynak" adl&#305; bir dosya at&#305;yor. Fakat dosyan&#305;n i&#231;i bo&#351; oluyor. D&#305;&#351; veri g&#246;nderme ile ilgili modal&#305;n&#305;n yard&#305;m&#305;na ihtiyac&#305;m var anla&#351;&#305;lan.. &#304;n&#351;allah sesimi duyar:))
 
Son düzenleme:

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,345
Excel Vers. ve Dili
Office 365 (64 bit) - Türkçe
E&#287;er fieldlar d&#252;zenliyse kod k&#305;salablir.
Kod:
strArray = split(text,"$")
rst.AddNew
for i=0 to ubound(strarray)
rst(i) = strArray(i)
next
rst.update
*******************************
MS Jet ile de al&#305;nabilir. Delimiter = ; olan &#246;rnek a&#351;a&#287;&#305;dad&#305;r.
http://www.excel.web.tr/showthread.php?t=41918&highlight=text
 
Son düzenleme:
Katılım
30 Ocak 2006
Mesajlar
937
Excel Vers. ve Dili
Access 2003
Arkadaşlar veri alma konusunda tüm işi hallettim. Çalışıyor, fakat 998 adet kayıt aktarabiliyorum. Buna anlam veremedim. Kayıtlar da özel bir kurumun verileri olduğu için buraya tamamen ekleyemiyorum. İçinde birsürü insanın telefonu adresi falan mevcut. Ne olur ne olmaz.. Fakat formu ekleyeyeim bir inceleyin ne gibi bir hata var. Modalı daha önce bir read satırında
text = f.ReadAll
değişikliği yaptırmış. Neden aktarma konusunda 998 kayıtttan yukarısını aktarmaz ki? Anlam veremedim.
Denemek için daha önce gönderdiğim orijinal dosyanın -txt- eksiltilmiş halini kullanabilirsiniz.
 
Katılım
30 Ocak 2006
Mesajlar
937
Excel Vers. ve Dili
Access 2003
San&#305;r&#305;m adresi 50 karakterden uzun olunca program veri aktar&#305;m&#305;n&#305; kesiyor. &#199;&#252;nk&#252; bir ba&#351;ka dosyada kesildi&#287;i yerde uzun bir adres var. O zaman ge&#231;ici tabloyu Not yapaca&#287;&#305;m bakal&#305;m ne oluyor.
 
Üst