Farklı iki txt dosyasının kombinasyonu

Bir sözlük saldırısı için sözlük dosyası buldum.

Özellikle bir satırda iki grup olsun istedim. Boşluklara da dokunmayıp satır üzerinde işlem yaptığını teyit etmek için.

İçinde 10 milyon kombinasyon var.

Sonra ikinci bir sözlük dosyası indirdim.

Bunda 10 bin kelime var ve hepsi bir satırda bir sütun

Oluşan dosya aşağıda.

İlk satırın yanına ikinciyi tekrarlı olarak ekliyor.

Yani elindeki listeleri, daha önce gösterdiğim gibi tek satırlara dönüştürürsen.

Ve son verdiğim kodu çalıştırırsan.

Benim işlemci hızımda tahmini 90 saniye sürdü, ama daha da sürebilir.

Ve iki dosyayı satırlarını eşleştirerek birleştiriyor.

Bir sorun göremedim.

Sadece çok beklemen gerekebilir. Doğal veriler büyük ve çarpan iterasyonla işlem yaptırıyoruz. Hem de okuma yazma işlemi.

Şu an aklında buna bir progres bar damı yapsak yüzde kaçına geldiğini anlamak için diye düşünmeye başladım.

Abi çok güzel hazırlamışsın teşekkür ederim

lakin hazırladığın kod ile

  1. dosyanın 1 satırı ile 2. dosyanın 2 satırı beraber birleşiyor ve fazla satırlı olan dosyanın satırları bitene kadar 2. dosya devretmeye devam ediyor

ama bizim istediğimiz

1.dosyanın 1.satırı ile 2. dosyanın bütün satırları tek tek birleşsin

sonra 1. dosyanın 2. satırı ile 2. dosyanın bütün satırları tek tek birleşsin

sonra 1. dosyanın 3. satırı ile 2. dosyanın bütün satırları tek tek birleşsin

sonra 1. dosyanın bütün satırları ile 2. dosyanın bütün satırları kombinasyonu tamamlanmış olur.

[Then_Shiffman] beyin hazırladığı kod çalışıyor ama bütün dosya tek sütuna yazılınca emeditör dahil hiç bir dosya sonucu tam açamıyor
belki [Then_Shiffman] hazırladığı kod bütün sonucu tek sütuna değilde birden fazla sütuna bölünebilirse dosyanın açılabilmesi daha rahat olur

Anladım.

Ama anlatamadım.

:slight_smile:

Şimdi siz ikinci dosyada 10 bin kaydınız varsa, birinci satırdaki koda 10 bin kez ekleyeceksiniz.

Bunu yaptığınızda metin dosyasının satır limitinin ötesine geçersiniz.

Sonuçta 10 binx1 milyon luk bir veriye dönüşür.

Then_Stiffman in yaptığı yanlış demedim.

Bu verilerle bunun içinden çıkamayabilirsiniz dedim.

Yani muhtemelen işlemi yapıyor ama o kadar uzun sürecek ki nasıl biter bilemedim.

Verdiğim kodu modifiye edersek tek satıra yazarız ama yine açamayacaksın.

Ne amaçla yaptığınızı anlasam belki alternatfi bir çözüm çıkarırım.

Bu şekilde oluşturacağınız veri açabileceğinizin üzerine çıkıyor.

Eminmisin bunu istediğine kodu değiştireyim.

yani yapabilirseniz çok seviniriz

Yaparım da açabilirmisin emin olamadım.

Sonuç olarak şöyle yapalım.

Veriler konusunda artık mutabıkız. iki dosyanı da veriler tek satırda olacak şekilde tutabiliyorsun.

Çıktıları satırlar şekilde yapmamız açmanı kolaylaştıracak.

Her birleştirdiğinde bir alt satıra geçsin?

filehandle1 = open('file1.txt', 'r')
filehandle2 = open('file2.txt', 'r')
filehandle3 = open('file3.txt', 'w')

while True:
    line1 = filehandle1.readline()

    if not line1:
        break
    
    while True:
        line2 = filehandle2.readline()
        if not line2:
            filehandle2.close()
            filehandle2 = open('file2.txt', 'r')
            break
        filehandle3.write(line1.strip()+line2.strip()+'\n')

filehandle1.close()
filehandle1.close()
filehandle1.close()
1 Beğeni

Birinci dosya bir den ona kadar yazıyla,

İkinci dosya a dan c ye kadar.

Sonuç resimde.

Büyük dosyayla ne kadar sürer onu da deneyip bakalım.

Aynen bu kodda çalışıyor
Şuan hala dosya işlenmeye devam ediyor tahminime göre 1-2 saat sürer
sonucunu bir daha haber veririm

çok teşekkür ederim

image

filehandle1 = open('file1.txt', 'r')
filehandle2 = open('file2.txt', 'r')
filehandle3 = open('file3.txt', 'w')

print("Wait for counting records first file...")
filecount = len(filehandle1.readlines())
filehandle1.close() # Don't ask why...
filehandle1 = open('file1.txt', 'r')

count =0

while True:
    line1 = filehandle1.readline()
    count = count+1
    if not line1:
        break
    
    while True:
        line2 = filehandle2.readline()
        if not line2:
            filehandle2.close()
            filehandle2 = open('file2.txt', 'r')
            break
        filehandle3.write(line1.strip()+line2.strip()+'\n')
    
    print("Processing: %"+"%0.4f"% ((count/filecount)*100))

filehandle1.close()
filehandle1.close()
filehandle1.close()

Bunu kullanırsan yüzdelik olarak gösterir en azından, ne kadar kaldı tahminde bulunabilirsin.

Baya sürecek gibi.

1 Beğeni

Bu arada yüzde 1 e geldiğinde dosya boyutu 1GB a ulaştı.

Bu dosyayı neyle açacaksın ben de merak ettim.

1 Beğeni

Aslında şık bir çözüm değil.

Ama birden fazla sütun oluşması için bir örnek de koyayım.

Normalde böyle yazılmaz ama okunup anlaşılabilirliği olsun diye böyle kodluyorum.

filehandle1 = open('file1.txt', 'r')
filehandle2 = open('file2.txt', 'r')
filehandle3 = open('file3.txt', 'w')

print("Wait for counting records first file...")
filecount = len(filehandle1.readlines())
filehandle1.close() # Don't ask why...
filehandle1 = open('file1.txt', 'r')

count =0

while True:
    line1 = filehandle1.readline()
    count = count+1
    if not line1:
        break
    
    while True:
        line2 = filehandle2.readline()
        line22= filehandle2.readline()
        line23= filehandle2.readline()
        if not line2:
            filehandle2.close()
            filehandle2 = open('file2.txt', 'r')
            break
        filehandle3.write(line1.strip() + line2.strip()+" , "
                         +line1.strip() + line22.strip()+" , "  
                         +line1.strip() + line23.strip()+'\n')
    
    print("Processing: %"+"%0.4f"% ((count/filecount)*100))

filehandle1.close()
filehandle1.close()
filehandle1.close()

Bu örnekte bir satıra 3 kayıt ekliyor. Handikapları var ama girmeyeceğim.

Sonuçta

image

Üçer üçer gruplamış. Olur.

Ama dosya boyutu o kadar yüksek ki ne yaparsan yap açılabilir gibi durmuyor.

2 Beğeni

Abi kodlar mükemmel olmuş elinize sağlık

dediğiniz gibi bu hazırladığımız dosyalar çok fazla yer kapladığı için açılması çok zor bu nedenle

pythonda şöyle birşey yapmak mümkün mü?

"Elimizde bulunan 1.txt(10 basamaklı sayı) ve 2.txt(6basamaklı sayı) dosyalarındaki verileri hazırladığınız kodlardaki gibi kombinasyon şeklinde birleştirsin ve yeni oluşan(16 basamaklı sayıyı) veriyi 3.txt dosyasında kayıtlı olan verilerle mukayese etsin

şayet
yeni oluşan 16 basamaklı veriler 3.txt dosyasındaki veriyle örtüşüyorsa bunu hemen 4.txt dosyasına yazdırsın

yok örtüşmüyorsa boşuna yazdırıp yer kaplamasın

Oluyordur herhalde.

Ama ben yine anlamadım.

Yani tabi bu istediğin şey de yapılır ama benim ne istediğini doğru anlamam gerekir.

Örneklerle açıklaman gerekir, benim de bir kaç sorum olacak.

Mesela,

10 basamaklı ve 6 basamaklı verileri birleştirdik, direkt 3. dosyaya yazdık.

Neden bir mukayese yapalım kafamda canlanmadı.

Yani eleyeceğimiz basamak sayısına göre değil mi?

Baştan elesek.

Sonuçta kombinasyonda tekrar eden veri varsa elemenin bir kaç yolu var ama.

Benim anlamadığım zaten 3. dosya 1 ve 2 nin kombinasyonu.

Her halukarda hepsi örtüşmez mi?

Yine aklıma gelen diğer bir şey.

Sonuçta ilk kayıtta 1 Milyon veri olduğunu biliyoruz.

100 Binlik 10 dosya şeklinde bölerek oluştursak olmaz mı?

En fazla bir sayaca 100 binse birinci dosyaya, 200 bin ise ikinci dosyaya yaz şeklinde bölebiliriz.

Şu şekilde örnekleyerek anlatayım

Elimizde üç adet dosya var

Birinci dosyada ilk 10 basamağı oluşturan sayıların bulunduğu liste var
İkinci dosyada ise son 6 basamağı oluşturan sayıların bulunduğu liste var

Üçüncü dosya ise şifrelenmiş bilgilerin bulunduğu dosya

Amacımız ilk dosyada bulunan 10 basamaklı sayılar ile ikinci dosyada bulunan son 6 basamaklı sayıları birleştirip sonra bunları Üçüncü dosya içerisinde bulunan şifreli verilerle aynı formata çevirip kıyaslamak
ve çeviri sonrası üçüncü dosyayla çakışan sayıları dördüncü bir dosyaya kaydetmek

ilk etabımız 1. ve 2. dosyalardaki sayıların kombinasyonunun bulunduğu 3. dosyayı oluşturma
(bunu bir nebze başardık lakin bu defa dosyalar çok büyük olduğu için açıp incelemek ve bunları depolamak çok büyük problem)

ikinci etabımız hex formatında hazırladığımız bu dosyaları adres formatına çevirmek

üçüncü etabımız çevirdiğimiz adresleri elimizde bulunan dosyada yer alan adreslerle çakıştırmak
ve çakışan varsa bunu ayrı bir dosyaya kaydettirmek

Tabi 1. etap sonrası
yaptığımız kombinasyon sonucunda oluşan sayılar çok fazla olduğu için
bunları depolamak yerine
yazılacak bir kod ile bunlar ara bellekte birleştirilip
istenen formata çevrilecek
ve hedef dosyadaki adreslerle çakıştırılacak

eğer sonuç pozitif ise harici bir dosyaya kaydettirilecek
negatif ise boşuna kaydedip yer kaplamayacak

Blok-alıntı

buda iyi bir fikir

Anladım.

Birinci ikinci dosyayı birleştir, şifreli dediğin bir diğer üçüncü dosyada olup olmadığını kontrol et ve o dosyada varsa eşleşenleri dördüncü bir dosyaya kaydet.

Ama zaten bir ve iki yi kombine ettik.

Elimizde bir anahtar dosya var(birleştirip oluşturduğumuz), bunu neden şifre dosyanızla karşılaştırıp doğrudan çakışanları bir başka dosyaya almıyoruz?

Ki bu da sonuçta şimdi iterasyon sayısını yine şifre dosyanızdaki kadar çarpan artıracak.

Her neyse onu da kodlarız sorun değil de.

How to split large text file in windows? - Stack Overflow

Siz bir gnu bash kurun.

split komutu ile dosyanızı parçalara bölmeyi deneyin.

Bakalım satırlardan bölebiliyor mı emin değilim ama en azında bir kaç satır elle düzeltir ana dosyanızı da okunabilir halde bir kaç dosyaya bölmüş olursunuz.

İmkansız diye bir şey yok ama büyük dosya işlemlerini ben burada teyit edemiyorum.

Doğru çalıştığından emin olmadan kod paylaşmam.

Ama bu kadar dosyayı da sürekli deneyemiyorum, o kadar zamanım olmuyor.

1 Beğeni

bize verilen anahtar dosya olan 3. dosya sha256 ile kodlandığı için ona denk geleni bulamıyoruz
düz 2lik 8lik veya 16lık sistem kodlanmış olsaydı dediğiniz gibi tümden gelim yöntemi ile anahtar dosyadan geri gelerek bulabilirdik
Lakin malumunuz sha256 geri döndürülemediği için yapamıyoruz

Eğer bize 1. ve 2.yi birleştirip 3.ye yazanı yazdığınız kodu “her 100.000 veya 200.000 olunca ilave dosya aç yaz” şeklinde yazabilirseniz oda bizim için büyük bir yardım olur

Artık bizde mecbur oluşturulan küçük dosyaları tek tek inceleriz

yada " Birinci ikinci dosyayı birleştir, şifreli dediğin bir diğer üçüncü dosyada olup olmadığını kontrol et ve o dosyada varsa eşleşenleri dördüncü bir dosyaya kaydet. " yapabilirsek o daha iyi olur

Daha iyi olacaksa;

Birinci dosya:

image

İkinci dosya:

image

Şimdi birinci ve ikincinin kombine edilmişine benzeyen ama arada hileli satırlar olan üçüncü dosya. Yani bu dosya sizin sha256 şifreli dosyayı temsil ediyor.

image

Programı çalıştırdığımda aldığım sonuç:

image

Yani bir le ikinin birleştirilmiş halini bir dosyaya yazmak yerine, üçüncü dosyanın içinde arıyor, eşleşirse dördüncü dosyaya yazıyor.

Ama büyük dosyada denemedim artık ne kadar sürerse sizin fantazinize kalmış.

filehandle1 = open('file1.txt', 'r') # First file
filehandle2 = open('file2.txt', 'r') # Second file
filehandle3 = open('file3.txt', 'r') # Check for combine
filehandle4 = open('file4.txt', 'w') # Equal list file

print("Wait for counting records first file...")
filecount = len(filehandle1.readlines())
filehandle1.close() # Don't ask why...
filehandle1 = open('file1.txt', 'r')

count =0

while True:
    line1 = filehandle1.readline()
    count = count+1
    if not line1:
        break
    
    while True:
        line2 = filehandle2.readline()

        if not line2:
            filehandle2.close()
            filehandle2 = open('file2.txt', 'r')
            break
        compare_key = ( line1.strip() + line2.strip()+'\n')
        print(compare_key)
       
        while True:
            line3 =  filehandle3.readline()
         
            if not line3:
                filehandle3.close()
                filehandle3 = open('file3.txt', 'r')
                break
            
            if line3 == compare_key:
                filehandle4.write(line3)
     
    print("Processing: %"+"%0.4f"% ((count/filecount)*100))

filehandle1.close()
filehandle2.close()
filehandle3.close()
filehandle4.close()

Aklınızda başka varyasyon varsa çekinmeyin onu da deneyelim :slight_smile:

1 Beğeni

Kodda fazladan test için print() bırakmışım göz zevkimi bozdu.

Onu kaldırdım.

Bir de işlem kaç saniye sürecek merak ettim.

from time import process_time

filehandle1 = open('file1.txt', 'r') # First file
filehandle2 = open('file2.txt', 'r') # Second file
filehandle3 = open('file3.txt', 'r') # Check for combine
filehandle4 = open('file4.txt', 'w') # Equal list file

print("Wait for counting records first file...")
filecount = len(filehandle1.readlines())
filehandle1.close() # Don't ask why...
filehandle1 = open('file1.txt', 'r')

count =0
t1_start = process_time() 

while True:
    line1 = filehandle1.readline()
    count = count+1
    if not line1:
        break
    
    while True:
        line2 = filehandle2.readline()

        if not line2:
            filehandle2.close()
            filehandle2 = open('file2.txt', 'r')
            break
        compare_key = ( line1.strip() + line2.strip()+'\n')
            
        while True:
            line3 =  filehandle3.readline()
         
            if not line3:
                filehandle3.close()
                filehandle3 = open('file3.txt', 'r')
                break
            
            if line3 == compare_key:
                filehandle4.write(line3)
     
    print("Processing: %"+"%0.4f"% ((count/filecount)*100))
t1_stop = process_time()
print("Elapsed time in seconds:", t1_stop-t1_start)

filehandle1.close()
filehandle2.close()
filehandle3.close()
filehandle4.close()

Bu kodun sonucu:

image

Tabi bende mili ve mikro saniyelere doğru süre ama sizde daha fazla olacaktır.

Bu kodun sonucu sizde kaç saniye sürecek merak ettim.

2 Beğeni

Abi mükemmel hazırlamışsın
kod çok güzel çalıştı
Ellerine sağlık
Beş dakikada örnek hazırladığım dosyada sonuçları buldu
Çok teşekkür ederim

Geriye son etabımız kaldı

Birinci ve ikinci dosyalardaki Hexdecimal kodları ara bellekte birleştirdikten sonra oluşan yeni veriyi Wallet(compressed/uncompressed) haline çevirip 3. dosyada bulunan wallet(compressed/uncompressed) adreslerle karşılaştırıp aynı olanları yazdırmak

Bunuda yapabilirseniz mükemmel ötesi olur :slight_smile: