Jak porównać 2 pliki tekstowe i "odrzucić" duplikaty?


(Djzon) #1

Jak porównać 2 pliki tekstowe i "odrzucić" duplikaty?

 

Np. plik tekstowy zajmuje 4 MB.

 

Dodam, że nie można tego wykonać w Open Office (zawieszanie programu - prawdopodobnie nie obsługuje dużego pliku tekstowego)

Plugin Compare 1.5.6 do Notepad++  - cały czas 25% CPU i przetwarza chyba coś "bez końca" - to też odpada.

Probowałem jeszcze inne sposoby znalezione w sieci ale bezskutecznie, zadnym sposobem/programem - nie mozna tego zrobić.

Wszystko się zawiesza lub trwa bez końca przetwarzanie.... i maksymalnym obciążeniem CPU...lub brakiem odpowiedzi

 

Pliki tekstowe zawierają tylko zwykłe linki i nic więcej..

 

W Wordzie w Windows 7  otwiera plik tekstowy bez problemu i szybko...


#2

Masz dwa pliki tekstowe z linkami i chcesz stworzyć jeden by nie było duplikatów?

Pliki tekstowe maja rozszerzenie txt. Ty używasz Open Office więc zapewne to doc. Zgadza się? Możesz zapisać do txt?

Z plików txt, wydaje mi się że można to szybko to zrobić skryptem w Pythonie. Jak coś to pisz.


(Djzon) #3

 

Żaden DOC

 

Zwyczajne TXT . Napisałem przecież pliki tekstowe!

 

Używam OpenOfficeCalc (!)

 

Nie proponowac mi żadne Pythony i ciągle Linuxa. Nie używam Linuxa, nie znam się na nim i "języki C++ , Python - to dla mnie czarna magia.

Total Commander - nie nadaje się do tego! Czytać uważnie, że są to tylko pliki tekstowe z linkami.


(roobal) #4

Jeśli nie istnieje Diff lub alteratywa dla Windows. Możesz pobrać livecd dowolnej dystrybucji Linuksa i skorzystać z Diff.

 

Python jest wieloplatformowy, a to że na Linuksie zrobisz to szybciej, niż w Windows, to nie miej pretensji do innych. Może w PowerShellu coś da radę zdziałać, ale to już musi się znaleźć spec od PowerShella.


(Djzon) #5

Nie ma na świecie żadnych programów pod Windows 7 ?, które obsługują porównywanie linków? Może lista programów (może nie znam wszystkich) a chętnie wypróbuje kolejne…(oprócz te co są na dobreprogramy)

Powershell - jest dobry ale potrzebny kod do niego.

 

PSPad  lub …WinMerge - porównuje ale tylko podświetla ale nie oddziela więc to jest złe rozwiązanie w przypadku długiej listy…

 

Bez obrazy…Chyba poraz kolejny będę musiał odwiedzić angielskie fora, tak będzie szybciej i więcej odpowiedzi, i więcej obeznanych ludzi jest :smiley:

Trochę to jest pilne, poczekam do jutra…

 

EDIT:

 

Np. ta stronka ma limit do 1 MB (więc też odpada)

http://www.diffnow.com/

 

roobal - podsunąłeś mi nazwę i znalazłem program…Jeśli można przetestować Pro versję to jutro sprawdzę taki program:

ExamDiff Pro

 

EDIT:

Program rozbudowany, wielofunkcyjne ale szkoda gadać.

Nic usuwa duplikatów

Jakaś mądra głowa przydałaby się aby go “rozgryść” bo ja nadal nie wiem jak porównać


#6

http://secretgeek.net/ps_duplicates.asp

Jeśli oczywiście każdy link jest w oddzielnej lini.

 

Jak się nie uda to:

  1. zainstaluj pythona 2.7 nie 3!

https://www.python.org/ftp/python/2.7.7/python-2.7.7.msi

  1. Pierwszy z plików tekstowych zapisz jako file1.txt drugi jako file1.txt. (na końcu każdego pliku powinna być pusta linia, jak jej nie ma to ja dodaj.

  2. Zapisz ten tekst jak remdup.py

 

 

a1=open(‘file1.txt’,‘rb’).readlines()+open(‘file2.txt’,‘rb’).readlines()

a1=list(set(a1))

open(‘wynik.txt’,‘wb’).writelines(a1)

 

 

  1. uruchom go przez dwuklik lub z konsoli poleceniem python remdup.py

  2. powinien Ci powstać plik wynikowy wynik.txt z usuniętymi duplikatami. Kolejność wierszy nie jest zachowana. Można chyba, też w miarę łatwo zrobić z zachowaniem kolejności ale będzie to długotrwałe.

Jakby był jakiś problem to pisz.


(Djzon) #7

Nie mam czarnego pojęcia co i jak. Po za tym jakieś błędy powstają… może coś źle robie :slight_smile:

Nie lubię się “bawić” w polecenia.

Zależy mi na szybkim porównywaniu (nie jednego a wielu plikówTXT z linkami), a tu za każdym razem muszę wklepywać jakiś kod.


(dragonn) #8

Spróbuj meld, jest wersja na Win i radzi sobie dosyć dobrze z dużą ilością danych (potrzebuje tylko czasu aż wszystko załaduje).


(Djzon) #9

dragonn - nie wypróbuje tego programu bo nawet brakuje .exe lub .msi/setup - więc jak to uruchomić? - Zerowe wytłumaczenie co i jak = program odpada!


#10

Pewnie pobrałeś wersję meld na linuksa. Wersja pod windows której nie sprawdzałem jest tutaj:

http://sourceforge.net/projects/meld-installer/

 

Masz problem z wersją pythonową? Tam nie musisz wpisywać poleceń. Po prostu jeden plik nazywasz file1.txt drugi file1.txt i dwukrotnie klikasz na remdup.py .

Jakieś błędy Ci wyskakują? Co się dzieje?

Po co Ci to o czym mówisz? Być może powinieneś kogoś do tego wynająć.


(dragonn) #11

Jak nie umiesz instalatora nawet znaleźć… -.- http://meldmerge.org/ " not-yet-official installer" http://sourceforge.net/projects/meld-installer/


(Djzon) #12

To tylko niewielki przykład:

 

Pierwsza lista:

np.

http://site.com/ab12345

http://site.com/ab12346

http://site.com/ab12347

http://site.com/ab12348

http://site.com/ab12376

http://site.com/ab12307

 

 

Druga lista:

http://site.com/ab00345

http://site.com/ab92346

http://site.com/ab12345

http://site.com/ab12346

 

 

więc wynikiem powinno być:

http://site.com/ab00345

http://site.com/ab92346

A w tym programie jest zupełnie inny wynik, druga - długa lista a powinno byc tylko kilka… więc nie tego sie spodziwałem.

po co te podświetlenie? Mi chodzi tylko o listę, nowe linki, których brak w 1 liście

=======================

Innym programem także nie można tego zrobić.

Odpowiedź administratora:

 

There's no direct way to delete duplicates with ExamDiff Pro. The rest can be done for for the former you need a different tool.

#13

A to wreszcie wytłumaczyłeś o co Ci chodzi. Trzeba było to zrobić od razu. W takim razie tamten skrypt w Pythonie też Ci nie pomoże. Zapewne można by było napisać inny skrypt w Pythonie.

Chyba gotowego programu do tego nie znajdziesz. Chociaż może się jeszcze nim pobaw.

 

Jak pierwsza lista to:

http://site.com/jeden

 

Druga lista to 

http://site.com/dwa

 

 

To wynikiem jest:

http://site.com/jeden

http://site.com/dwa

 

czy tylko:

http://site.com/dwa

 

 

?


(Djzon) #14

Wynikiem jest tylko

http://site.com/dwa

ponieważ na pierwszej liście nie ma tego


#15

Czyli chodzi Ci o różnice zbiorów. W Pythonie to będzie tak http://pastebin.com/h8YekghE

Zapisz to jako remove.py skopiuj tam pliki file1.txt i file2.txt i dwukrotnie kliknij na remove.py. Pliki txt muszą mieć enter na końcu.

Oczywiście najpierw zainstaluj pythona z tego linku co podałem wcześniej. Jakby były jakieś problemy to pisz.

Wydaje mi się że szukanie programu będzie bezowocne (no, ale mogę się mylić).

Ewentualnie przerobić program by pobierał nazwy plików z lini poleceń i dorobić do tego graficzny interfejs jakimś generatorem.


#16

Mówisz o skrypcie w pythonie? U mnie dziala poprawnie, wiec wszedzie powinien. Tu masz wersje z plikami testowymi i napisz czy dziala poprawnie:

http://tinyurl.com/qyrb7jn


(Djzon) #17

Może jednak działa Twój skrypt :slight_smile:

 

Nie znalazło teraz duplikatów, więc chyba jest OK.

Ale muszę dokładniej to sprawdzić z większymi listami.

Ale nie dziś po późno jest…

Jutro rano na spokojnie przeanalizuje i sprawdzę dokładniej i dam Ci znać tutaj lub na PM.


(somekind) #18

Istnieje jakiś milion alternatyw, a żeby użyć diffa pod Windowsem wystarczy zainstalować np. GnuWin. Nie trzeba żadnego linuksa do tego.

 

Jeśli ktoś nie umie programować, to nie zrobi tego pod żadnym systemem. Jeśli umie, to zrobi pod każdym w zbliżonym czasie.

 

LOL :smiley:

PowerShell może wszystko to, co .NET, więc dużo więcej niż gołe linuksowe terminalki.

Wystarczy taki skrypt:

param([parameter(Mandatory=$true)][string] $firstFile, [parameter(Mandatory=$true)][string] $secondFile)

$firstSet = [System.IO.File]::ReadAllLines("$(Get-Location)\$firstFile")
$secondSet = [System.IO.File]::ReadAllLines("$(Get-Location)\$secondFile")
$result = $secondSet | ?{ $firstSet -notcontains $_ }
[System.IO.File]::WriteAllLines("$(Get-Location)\diff.txt", $result)
echo 'Done'

I uruchomić go tak:

. .\Filediff.ps1 'first.txt' 'second.txt'

(Djzon) #19

 

W 2 sekundy pokazało wynik (plik tekstowy), więc nie rozumiem co znaczy szybciej w Linuksie?

Zainstalowałem pythona 2.7

Wykorzystałem scrypt użytkownika KamilDz

Po prostu wcześniej nie miałem do czynienia z tym językiem programistyczny jeśli dobrze mówię i zawsze wydawało mi się, że trzeba pisać żmudne wiersze kodu.

Przyznam się, że mam przyjaciela Rosjanina i on doskonale zna się na pisaniu oprogramowania i skryptów i podsuwał mi gotowe skrypty do różnych zastosowań (ale działały w przeglądarce np. w KONSOLI)