[ kristina11 @ 14.01.2008. 12:38 ] @
sve iskusne u vb6 molim za pomoc

imam txt file koji izgleda ovako

primer

aaaaaaa
bbbbbbb
ccccccc
aaaaaaa
aaaaaaa
acacaca

treba da uklonim sve duplikate iz fajla tako da ostanu samo unique linije

trazila sam po netu 2 dana a uglavnom to sto sam nasla nije radilo

hvala
[ Aleksandar Vasic @ 14.01.2008. 14:50 ] @
Najbolje bi bilo da taj fajl ucitas u textbox ili listbox,pa onda da izbaci duplikate pa da stvori txt fajl

Ucitavanje u textbox:

Code:
Open "C:\tekst.txt" For Input As #1
Do Until EOF(1)
Line Input #1, LineOfText$
Text$ = Text$ & LineOfText$ & vbCrLf & Wrap$
Loop
Text1.Text = Text$         'gde ti je Text1 ime textbox-a


Ucitavanje u listbox

Code:
Open "C:\tekst.txt" For Input As #1
Do
Input #1, a
List1.AddItem a     'gde ti je List1 ime Listbox-a
Loop Until EOF(1)


Snimanje fajla iz textbox-a

Code:
Open "C:\tekst.txt" for Output as #2
Print #2, Text1.Text
Close #2


Snimanje fajla iz listbox-a

Code:
Open "C:\tekst.txt" For Output As #2
For i = 0 To List1.ListCount
Print #2, List1.List(i)
Next i


e a za izbacivanje duplikata ces morati da sacekas na odgovor nekog od iskusnijih ;)
[ djpero.84 @ 14.01.2008. 14:52 ] @
Mislim ne znam u kojoj mjeri odgovor zelis, ali da li si malo razmislila kako to treba da radi i pokusala ista uraditi?

Po meni ono sto bi trebalo je splitovati fajl koji ucitas po vbcrlf u array string i uporedjivati najnoviju liniju sa prethodnim linijama, i ako prodje kao unique upisivati u novi tekst fajl liniju po liniju.



P.S. ili bi "parce koda" :) | Ili pak, kako rece jedan od uvazenih kolega ovog foruma, najbolje bi bilo da napisete block koda koji se odnosi na to jer neki govore kako neznaju gdje bi to ubacili ili pak prekopiraju kod a nemaju kontrola na formi i sl. :) pa eto razumite i nas koji se pomalo (koliko znaju i umeju) trude da vam odgovore ......
[ goranvuc @ 14.01.2008. 15:58 ] @
Pa za to ti i ne treba VB 6.0 dovoljan je Excel: Importuj tekst, idi na Data/Filter/Advanced Filter i obelezi "Unique records only"
[ kristina11 @ 14.01.2008. 16:50 ] @
pa znam da netreba ali meni treba
moze da se uradi i sa ultraedit-om
ali ja hocu da se na jedan click to urdi samo

---------------

evo sad probam neki cod
ima pomaka ali mi jos tu dosta stvari nije jasno
naprimer uspela sam da odstranim neke duplikate ali i ne sve nekoliko parova ostane
nastavicu da pokusavam pa cu da se javim kasnije

hvala svima na pomoci
[ djpero.84 @ 14.01.2008. 16:58 ] @
Pa postavi taj "bugoviti" kod da vidimo :)
[ kristina11 @ 14.01.2008. 17:21 ] @
ovo sam uzela kao primer
cod ispod brise prazne redove is txt-a

Code:

    Dim sBuff As String
    Dim sTemp As String
    
    Open "c:\test.txt" For Input As #1     
    Open "c:\output.txt" For Output As #2  
    
    Do Until EOF(1) 'read in file until done
        Line Input #1, sBuff
        If Trim(sBuff) = "" Then      
            sTemp = "i love ars"     
            Do Until Trim(sTemp) = ""
                Line Input #1, sTemp
                DoEvents
            Loop
        Else
            Print #2, sBuff           
        End If
        DoEvents
    Loop
    Close #1
    Close #2




a ovo je izmenjeni prvi koji brise ali ne sve

Code:

Dim sBuff As String
    Dim sTemp As String
    
    Open "c:\1a.txt" For Input As #1     
    Open "c:\11.txt" For Output As #2  
    
  Do Until EOF(1) 'read in file until done
        Line Input #1, sBuff
        If Trim(sBuff) = sTemp Then      
            sTemp = "jejeje"     
            Do Until Trim(sBuff) = sTemp
                Line Input #1, sTemp
                DoEvents
            Loop
        Else
            Print #2, sBuff          
        End If
        DoEvents
    sTemp = sBuff
    Loop
    
    Close #1
    Close #2


e sad ovaj prvi radi jer je "" konstanta
a meni sbuff treba da uzima novu vrednost
kako god ovo je napredak nadam se da cu uspeti da uradim nesto



[Ovu poruku je menjao Aleksandar Ružičić dana 14.01.2008. u 19:02 GMT+1]
[ steve585 @ 14.01.2008. 17:32 ] @
Da li je ikako moguce posmatrtai taj file kao tabelu nad kojom je moguce izvrsiti SQL upit. Na taj nacin ces Distinct upitom ocistiti duple vrijednosti :-)
[ Aleksandar Ružičić @ 14.01.2008. 18:27 ] @
evo nesto na brzaka:
Code:

Public Sub RemoveDuplicatatedLines(Filename As String, Optional Compare As VbCompareMethod = vbBinaryCompare)

    Dim fIn         As Integer
    Dim fOut        As Integer
    Dim sTemp       As String
    Dim sLine       As String
    Dim sBuffer()   As String
    Dim lLineCount  As Long
    Dim i           As Long
    Dim bDuplicate  As Boolean
    
    sTemp = Filename & ".~" & CStr(Int(Rnd * 99999))
    
    fIn = FreeFile
    
    ReDim sBuffer(1 To 50)
    lLineCount = 0
    
    Open Filename For Input Access Read As #fIn
        
        fOut = FreeFile
        
        Open sTemp For Output Access Write As #fOut
        
            While Not EOF(fIn)
                
                Line Input #fIn, sLine
                
                bDuplicate = False
                
                For i = 1 To lLineCount
                    If StrComp(sLine, sBuffer(i), Compare) = 0 Then
                        
                        bDuplicate = True
                        Exit For
                        
                    End If
                Next
                
                If Not bDuplicate Then
                    
                    Print #fOut, sLine
                    
                    If lLineCount >= UBound(sBuffer) Then
                        
                        ReDim Preserve sBuffer(1 To lLineCount + 50)
                    
                    End If
                    
                    lLineCount = lLineCount + 1
                    sBuffer(lLineCount) = sLine
                
                End If
            
            Wend
        
        Close #fOut
        
    Close #fIn
    
    FileCopy sTemp, Filename
    
    On Error Resume Next
    
    Kill sTemp
    
    On Error GoTo 0

End Sub

nije bas najefikasnije resenje ni najbolje (recimo, podrzava samo PC textualne fajlove, tj fajlove u kojima je kraj reda oznacen za CRLF karakterima) ali recimo da je "zlatna sredina" i da ce odgovarati za 90% slucajeva (na windows masini)

a koristi se ovako:
Code:

RemoveDuplicatatedLines "c:\test.txt"
[ kristina11 @ 14.01.2008. 19:30 ] @
aleksandre radi super

hvala ti ko bratu :)

takodje hvala svima koji su pomagali
pozdrav
[ Shadowed @ 14.01.2008. 20:54 ] @
Krcko, nisam 100% siguran (al' 99.9 :)), ali mi se cini da brze ide ako se prvo sve ucita, zatim sortira, a onda jednim prolazom izbace duplikati (poredis susedne). S' tim da je potrebno koristiti neke liste/kolekcije za to (polako zaboravljam sta od toga ima u 6ici) da ne bi resize-ovao nizove. Naravno, kakav sam lenj, opet me mrzi da pisem kod, samo teoretisem :)
[ Aleksandar Ružičić @ 14.01.2008. 21:48 ] @
heh da sam se kladio da ces da se javis da "kritikujes" kod (i pri tom pomenes kako u 6ici nema nista u poredjenu sa .net-om) dobio bi, doduse malo pare posto bi kvota bila mala :D

LM, na mestu je tvoj komentar, zato sam i rekao da ono nije najefikasnije resenje, samo sam znao da onakav kod mogu da napisem iz glave, bez testiranja, a sa kolekcijama (da, ima ih u 6ici, mada one ugradjene nisu nesto, al zato postoji par SuperCollection resenja) bih morao da pokrecem vb da proveravam kod :)
[ Shadowed @ 14.01.2008. 22:29 ] @
Ih, pa mogao si valjda da napravis jedan sorted binary tree iz glave :P
Taman i ne moras posle da ga sortiras. Mada, merge sort radi brze nad obicnom listom nego bin. tree (sto je mene iznenadilo, iskreno receno).
[ Eurora3D Team @ 16.01.2008. 00:09 ] @
Mozes i ovako
Code:

Private Sub RemoveLines(strFileName As String)
On Error GoTo Err
Dim hFile As Integer, strLine As String, strBuffer As String
hFile = FreeFile
Open strFileName For Input As #hFile
Do Until EOF(hFile)
Line Input #hFile, strLine
If strBuffer = "" Then
strBuffer = strLine & vbCrLf
Else: If InStr(1, strBuffer, strLine) = 0 Then strBuffer = strBuffer & strLine & vbCrLf ' ako ga nemamo u string bufferu onda dodajemo
End If
Loop
Close #hFile
hFile = FreeFile
Open strFileName For Output As #hFile
Print #hFile, strBuffer
Close #hFile
Exit Sub
Err:
Debug.Print Err.Description
End Sub

Private Sub Command1_Click()
RemoveLines "c:\text.txt"
End Sub


Usput, resenja za ovako proste probleme mozes da nadjes samo na forumima (ne na sajtovima sa free kodom)
Pozdrav
[ Shadowed @ 16.01.2008. 00:37 ] @
Mislim da je ovo jos sporije.
Bilo bi zanimljivo napraviti benchmark i poredjenje (cisto ako je iko raspolozen, prvobitni problem je ionako resen). Ako stignem napravicu moju varijantu (read, sort, loop and delete).
Fajl za testiranje se moze napraviti tako sto se generise npr. 10000 slucajnih celih brojeva od 1 do 100000. Tako ce otprilike 10% biti duplirano.
[ Eurora3D Team @ 16.01.2008. 12:51 ] @

Nema sta tu da se misli.
Imate VB6 projekat za testiranje brzine pa ako neko hoce da testira svoju neka ga skine i doda svoju fn (ubacio sam nase dve).
Inace, brzina zavisi od duzine linija i broja ponavljanja.
Pozdrav
[ Shadowed @ 16.01.2008. 13:32 ] @
Evo i fajlova sa slucajnim brojevima. Ima jedan od 10 000, jedan od 100 000 i jedan od 1 000 000 redova. Morao sam na rapidshare okaciti posto je prevliki .rar za upload...
http://rapidshare.com/files/84245437/RndNumbers.rar
[ BinLaden @ 17.01.2008. 22:31 ] @
Kad je takmicenje u pitanju to ne moze da prodj bez mene. heheheh...
Code:
Private Sub BinLaden(FileName As String)
Dim sFile As String, sFined As String, sOst As String
Dim lEnd As Long, lStart As Long
Dim hFile As Long
Const lCr = 2

    hFile = FreeFile
    Open FileName For Input As #hFile
    sFile = StrConv(InputB(LOF(hFile), hFile), vbUnicode)
    Close hFile
    
    lStart = 1
    lEnd = InStr(lStart, sFile, vbCrLf)
    
    Do While Not lEnd = 0
        sFined = Mid(sFile, lStart, lEnd - lStart + lCr)
        sOst = Replace(sFile, sFined, "", lEnd + lCr)
        sFile = Left(sFile, lEnd + 1) & sOst
        lStart = lEnd + lCr
        lEnd = InStr(lStart, sFile, vbCrLf)
    Loop
    
    On Error Resume Next
    Kill FileName
    
    hFile = FreeFile
    Open FileName For Append As #hFile
    Print #hFile, sFile
    Close hFile
    
End Sub

U vecini slucajeva ovaj kod je najbrzi, mada bi mjerodavnije bilo da se testiraju na istom file-u sve tri funkcije.

@Shadowed: onaj rar sto si okacio u prethodnoj poruci ne valja, ne mogu da ga otvorim.
[ Shadowed @ 17.01.2008. 22:50 ] @
Ja sam ga sada skinuo, uporedio sa onim koji sam i poslao, identicni su. Zatim sam taj skiuti i raspakovao bez problema (total commander-om). Verovatno je tebi ostecen prilikom skidanja. MD5 je 3bc6850e2fcfa412b199d41c2fb85abc
[ Eurora3D Team @ 18.01.2008. 00:37 ] @
Citat:

U vecini slucajeva ovaj kod je najbrzi, mada bi mjerodavnije bilo da se testiraju na istom file-u sve tri funkcije.

Jeste , narocito kad je kompajlovan u exe.
Tako da , ako nekom treba ovo resenje, neka koristi trecu funkciju.
Isto kad smo kod performansi (tek sam ovde to primetio) velika je razlika kad se testira iz VB IDE i iz exe verzije.
Ne samo sto je iz IDE malo sporije nego neka fn moze da radi brze u njemu a sporije (od neke druge) u kompajlovanom programu.

[ Aleksandar Ružičić @ 18.01.2008. 15:13 ] @
pa nije fer, ja nisam znao da ce biti ovog "takmicenja", napisao sam kod iz glave (bez testiranja) koji bi trebalo da radi to sto je trazeno, nisam ni mislio na performanse :)

al dobro, eto nek ostane ovaj kod kao primer najsporijeg, a ako budem imao vremena (mada cisto sumnjam) uradicu i jednu brzu verziju...
[ Eurora3D Team @ 18.01.2008. 21:14 ] @

Nismo ni mi hteli takmicenje.
@Shadowed je prvi pomenuo brzinu.
Za ovakve sitnice 50 milisekundi gore dole nije ni bitno
[ BinLaden @ 19.01.2008. 04:34 ] @
@@@Off topic....Kao i prethodni zadnji postovi....
Ovaj VB forum je stvarno postao monoton, i u zadnje vrijeme stvarno nemam volje da komentarisem ovde.
Do duse ima nekih novih korisnika koji su donijeli neka nova-stara egzoticna pitanja, ali ***es forum na
kome moderatori imaju najvise postova. Ajd' da su to odgovori na pitanja, al' 70% vasih komentara su
of topic, odnosno vase javno dopisivanje i prepucavanje.
1.Moj predlog ovde je da se shadowedu da moderatorska titula
i na ovom forumu(mada mu to pripada po tituli), al njegovo ime ne stoji ovde. Covjek je aktivniji na ovom forumu
nego na onom na kome je zaduzen. heheh....
2. Aleksandar je pokusao da ozivi forum sa onim tutorijalima, ali iako su svi podrzavali inicijativu, to je propalo.
3. Moj prijedlog: Posto se ovaj forum odvija izmedju nekih 7-8 clanova (da nam rajko nije otisao bilo bi nas vise)
mislim da bi zanimljivije bilo da mi izmedju sebe postavljamo pitanj odnosno zadatke u kojima bi se takmicili,
slicno kako je bilo u ovoj temi. Mislim da bi zbog sujete i dokazivanja bilo vise zainteresovanosti nego za one
tutorijale koje @alex... predlozijo.

@Alekandar:
Sad se vadis posto je tvoja funkcija najsporija da si pisao napamet odnosno iz glave a ne u VB editoru.
Ne mislim da nisi mogao i znao bolje, ali isto tako ne vjerujem da si pisao iz glave odnosno da nisi
provjerio izvrsavanje koda kako ti tvrdis. Ako je tako, samo mi onda objasni kako si izvrsio uvlacenje redova
u kodu. Na ES kada pises poruku TAB ne radi, a nemoj mi reci da si pored VB koristio neki drugi editor.
Priznaj da je 1:0 za mene i Eurora3D Team pa da nastavimo dalje sa takmicenjem ako ima jos neko ZA????

[Ovu poruku je menjao Aleksandar Ružičić dana 19.01.2008. u 06:44 GMT+1]
[ Aleksandar Ružičić @ 19.01.2008. 05:50 ] @
1. koliko ja znam Shadowed je trazio da se skine sa liste moderatora VB&ASP foruma (bio je on tu izlistan do pre neko vreme), ali mozda gresim.
2. ja mislim da nije propalo, imam ja zapoceta 2 zanimljiva tutorijala (malo duza) ali su me trenutno pritegli kolokvijumi i ispitni rok pa ne stizem da zavrsim
3. nije los predlog, pokreni temu, zadaj neki zadatak pa cemo da vidimo koliki je odziv

Citat:
BinLaden:
@Alekandar:
Sad se vadis posto je tvoja funkcija najsporija da si pisao napamet odnosno iz glave a ne u VB editoru.
Ne mislim da nisi mogao i znao bolje, ali isto tako ne vjerujem da si pisao iz glave odnosno da nisi
provjerio izvrsavanje koda kako ti tvrdis. Ako je tako, samo mi onda objasni kako si izvrsio uvlacenje redova
u kodu. Na ES kada pises poruku TAB ne radi, a nemoj mi reci da si pored VB koristio neki drugi editor.
Priznaj da je 1:0 za mene i Eurora3D Team pa da nastavimo dalje sa takmicenjem ako ima jos neko ZA????

ne vadim se :) stvarno. ne lazem kada kazem da nisam proveravao izvrsavanje koda, nisam pokretao vb. a sto se tice nazubljenosti koda, to je zato sto sam ga otkucao u editplusu (koji mi se dize sa sistemom i uvek je ukljucen, jer kad sam za kompom uvek nesto raduckam u njemu, tj il pisem neki program il kodiram neki sajt) i posle prekopirao u ovaj ES-ov box (uglavnom tako radim kad postujem malo veci kod, upravo zbog toga sto ES nedozvoljava TAB, mada to moze lako da se ispravi, ali cisto sumnjam da ce bilo sta da se menja na forumu u sledecih godinu dana...)

ajde priznajem (mada nikad nisam osporavao) da vodite 1:0 :) i kao sto sam rekao u nekom predhodnom postu, ako budem stigao napisacu optimizovanu verziju :D
[ Shadowed @ 19.01.2008. 12:46 ] @
Da, bio sam ja ovde odavno moderator zajedno sa jos 11 ili 12 foruma, al' sam batalio to. Zanimljivije mi ovako. Ono cim je tu neka obaveza mene mrzi :P
Ja trenutno ucestvujem na forumu bas onako kako mi se svidja :) Ako nekom smeta neka kaze pa ce se uzeti u razmatranje;)
Posto je ocigledno forum krenuo u narucivanje kodova i vrtenje sve istih stvari (tako je to sa starim teKnologijama :P), zato ja tako podstaknem neku stvar makar i offtopic (pogtovo ako je resenje na osnovni problem vec dato). Ova tema je primer. Problem resen, ali se nastavila dalje diskusija o razlicitim nacinima, sta je zasto bolje i sl.
U vezi tutorijala, ja sam odmah rekao da necu ni da hvalim ideju kad znam da ja necu pisati iste (em nemam vremena, em me mrzi).
Pitanja medju nama, naravno, sto da ne, samo da se ne pise mnogo koda :))
[ Eurora3D Team @ 20.01.2008. 17:49 ] @
Ajde i ja da dodam nesto.
Prvo zezanje
Znaci bolji smo
A ozbiljno , bolje da se delimo na one koji znaju da programiraju i na pocetnike (ili one koji su zaboravili da programiraju ).
Ima nas desetak koji znamo VB a ostali (ima ih vise) postavljaju pitanja.
Ovde na VB forumu postavljaju pitanja uglavnom oni koji se bava programiranjem iz hobija.
Na c/c++ forumu su uglavnom studenti IT faxa (znam posto i tamo dajem odgovore)
Ovo da je forum postao mesto za narucivanje koda ... pa sta fali tome (jedan naruci a posle 100 vide i nauce nesto).
Ne znam koja je bila ideja osnivaca foruma u vezi ovoga ali po svim programerskim forumima mogu da se nadju primeri koda.
Ovo za Aleksandra , da se nekom ko cita ne ucini da je on neki amater ovde , do sad sam video desetine njegovih primera (posto i on voli da postavlja kod a ne da se bavi teorijom) tako da rezultat sigurno nije 1:0 . Mozda ovaj put jeste al ukupno gledajuci nije.
Pozdav