txt dosyası içinde satır düzeltme

Katılım
1 Mart 2016
Mesajlar
25
Excel Vers. ve Dili
2003
Herkese merhabalar,
Elimde Excel üzerinden veri kaydettiğim bir txt dosyası var. Değerleri birbirlerinden noktalı virgül ile ayırarak kaydedip, gerektiğinde Excel'e geri çekiyorum. txt. Dosyasının içeriği şuna benziyor;

1 ; 11.02.2024 ; 34ABC01 ; 300 litre ; motorin
2 ; 13.02.2024 ; 34ABC02 ; 280 litre; benzin

Ben bu txt dosyası içerisinde isteğim sıra numarasını bulup, satırın sonuna ilave bir değer eklemek istiyorum. Örnek vermek gerekirse isteğim satırları aşağıdaki gibi değişmek istiyorum.

1 ; 11.02.2024 ; 34ABC01 ; 300 litre ; motorin ; 240 km
2 ; 13.02.2024 ; 34ABC02 ; 280 litre; benzin ; 210 km

Dediğim gibi "Append" komutu ile txt dosyanın sonuna yeni bir satır ekleyebiliyorum ya da istediğim değeri bulup çekebiliyorum ama dosyanın kalanına dokunmadan satır düzeltme işini bir türlü beceremedim. Problem hakkında siz Değerli üstatların desteğini rica ediyorum.
 

Necdet

Moderatör
Yönetici
Katılım
4 Haziran 2005
Mesajlar
15,359
Excel Vers. ve Dili
Ofis 365 Türkçe
Merhaba,
Bence bu tür şeylerle hiç uğraşmayın.
Excele çekin gerekli düzeltmeleri yapın, text dosyasını yeniden oluşturun.
Kısaca bildiğiniz yöntem en kısa yöntemdir.
 
Katılım
1 Mart 2016
Mesajlar
25
Excel Vers. ve Dili
2003
Necdet Bey merhabalar.
Problem birden fazla kullanıcının aynı anda txt dosyasına kayıt yapması. Dosya Yandex disk üzerinde kayıtlı. Ben üzerinde gerekli girdileri yapıncaya kadar dosya güncellenmiş olabiliyor, yani benim Excel'e çekip değiştirdiğim veriye ilaveler yapılmış olabiliyor. Dolayısıyla ilgili satırı bulup düzelterek dosyanın guncelliğini korumam gerekiyor.
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,334
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
Metin dosyasında ara satırları okuduğunuzda size bir işaretçi yerine değerin kendisi geldiği için, satır güncellemesi dosyanın tamamınını etkiler. Yani, ara satırlara en az bir karakter bile ilave veya güncelleme yapacaksanız bu, dosyanın tamamının yeniden yazılması anlamına gelir. VB' nin disk sektör vs erişim gibi kabiliyeti yoktur.

@Necdet Beyin önerisini dikkate alın veya en azından Excel/Access dosyasnı veritabanı olarak kullanmalısınız..

.
 
Katılım
1 Mart 2016
Mesajlar
25
Excel Vers. ve Dili
2003
Sayın Gürsoy, desteğiniz için teşekkür ediyorum. Sizin ve Necdet Beyin önerileri doğrultusunda halletmeye çalışacağım.
Kolaylıklar.
 

veyselemre

Özel Üye
Katılım
9 Mart 2005
Mesajlar
3,642
Excel Vers. ve Dili
Pro Plus 2021
Txt dosyası olarak değilde binary dosyası olarak aşağıdaki gibi kullanılabilir. 90 lı yıllarda basic'le programlar bu tarzda yapılıyordu.

Kod:
Type kayitTipi
    kayitNo As Integer
    tarih As Date
    plaka As String * 12
    yakit As String * 15
    cinsi As String * 10
    mesafe As String * 10
End Type
Sub kayitlariEkle()
    Dim fName$, i, son&, kayitSayisi&
    Dim kayit As kayitTipi

    son = Cells(Rows.Count, 2).End(3).Row
    If son < 3 Then Exit Sub
    fName = ThisWorkbook.Path & "\veri.dat"

    Open fName For Random As #1 Len = Len(kayit)
    kayitSayisi = LOF(1) \ Len(kayit)

    For i = 3 To son
        kayitSayisi = kayitSayisi + 1
        kayit.kayitNo = kayitSayisi
        kayit.tarih = Cells(i, 2).Value
        kayit.plaka = Cells(i, 3).Value
        kayit.yakit = Cells(i, 4).Value
        kayit.cinsi = Cells(i, 5).Value
        kayit.mesafe = Cells(i, 6).Value
        Put #1, kayit.kayitNo, kayit
    Next i
    Close #1
End Sub
Sub kayitlariGetir()
    Dim fName$, i, son&, kayitSayisi
    Dim kayit As kayitTipi
    Range("H3:M" & Rows.Count).ClearContents
    fName = ThisWorkbook.Path & "\veri.dat"
    Open fName For Random As #1 Len = Len(kayit)
    kayitSayisi = LOF(1) \ Len(kayit)
    For i = 1 To kayitSayisi
        Get #1, i, kayit
        Cells(i + 2, 8).Value = kayit.kayitNo
        Cells(i + 2, 9).Value = kayit.tarih
        Cells(i + 2, 10).Value = kayit.plaka
        Cells(i + 2, 11).Value = kayit.yakit
        Cells(i + 2, 12).Value = kayit.cinsi
        Cells(i + 2, 13).Value = kayit.mesafe
    Next i
    Close #1
End Sub
Sub tumKayitlariDuzenle()
    Dim fName$, i, son&, kayitSayisi&
    Dim kayit As kayitTipi

    son = Cells(Rows.Count, 8).End(3).Row
    If son < 3 Then Exit Sub
    fName = ThisWorkbook.Path & "\veri.dat"
    Open fName For Random As #1 Len = Len(kayit)

    For i = 3 To son
        If Cells(i, 8).Value > 0 Then
            kayit.kayitNo = Cells(i, 8).Value
            kayit.tarih = Cells(i, 9).Value
            kayit.plaka = Cells(i, 10).Value
            kayit.yakit = Cells(i, 11).Value
            kayit.cinsi = Cells(i, 12).Value
            kayit.mesafe = Cells(i, 13).Value
            Put #1, kayit.kayitNo, kayit
        End If
    Next i
    Close #1
End Sub

Sub tekKayitGetir()
    Dim fName$, i, son&, kayitSayisi
    Dim kayit As kayitTipi
    Range("P3:T3").ClearContents
    fName = ThisWorkbook.Path & "\veri.dat"
    Open fName For Random As #1 Len = Len(kayit)
    kayitSayisi = LOF(1) \ Len(kayit)
    If Range("O3").Value > 0 And Range("O3").Value <= kayitSayisi Then
        Get #1, Range("O3").Value, kayit
        Cells(3, 15).Value = kayit.kayitNo
        Cells(3, 16).Value = kayit.tarih
        Cells(3, 17).Value = kayit.plaka
        Cells(3, 18).Value = kayit.yakit
        Cells(3, 19).Value = kayit.cinsi
        Cells(3, 20).Value = kayit.mesafe
    End If
    Close #1
End Sub

Sub tekKayitDuzenle()
    Dim fName$
    Dim kayit As kayitTipi

    fName = ThisWorkbook.Path & "\veri.dat"
    Open fName For Random As #1 Len = Len(kayit)
    If Cells(3, 15).Value > 0 Then
        kayit.kayitNo = Cells(3, 15).Value
        kayit.tarih = Cells(3, 16).Value
        kayit.plaka = Cells(3, 17).Value
        kayit.yakit = Cells(3, 18).Value
        kayit.cinsi = Cells(3, 19).Value
        kayit.mesafe = Cells(3, 20).Value
        Put #1, kayit.kayitNo, kayit
    End If
    Close #1
End Sub
 

Ekli dosyalar

Üst