Avatar billede nbnielsen Nybegynder
30. august 2005 - 13:36 Der er 6 kommentarer og
1 løsning

Sammenlign to filer.

Jeg skal have sammenlignet linierne i to filer.

Dvs, der er en reference fil der indeholder nogle fil navne. Og så har jeg en anden fil, der måske kun indeholder nogle af de samme filnavne som reference filen.

Det scriptet så skal gøre, er at fjerne de linier fra reference filen, som eksisterer i den anden fil. Så til sidst ender jeg op med en ny reference fil der indeholder de manglende filer, eller manglende linier, som ikke er i den anden fil.


Jeg mangler et skub i den rigtige retning :)
Avatar billede softspot Forsker
31. august 2005 - 01:43 #1
Du skal bruge FSO (FileSystemObject) til at indlæse filerne med, så skal du lægge dem i to strenge som du så splitter op ved linieskift så du får arrays ud af det.
Derefter kan du gennemløb den ene array og sammenligne hvert element med hvert element i det andet array. Når du finder et element som er ens, flytter du det sidste element fra referencelisten ned på det fundne elements plads. På denne måde får du samlet alle filnavnene i starten af listen og kan dermed hugge resten af listen af inden du gemmer...
Avatar billede softspot Forsker
31. august 2005 - 02:25 #2
Denne udgave fjerne linier i ref.txt som eksisterer i newlist.txt.

Jeg har desuden flg. bemærkninger til funktionaliteten af scriptet:

1. linierne i ref.txt kan skifte plads, dvs. rækkefølgen vil ikke være den samme fra gang til gang.

2. filnavnene vil blive gemt i lowercase efter første kørsel med dette script

Here goes:

set fso = CreateObject("Scripting.FileSystemObject")
set strmRef = fso.OpenTextFile("ref.txt",1)
strRef = strmRef.ReadAll()
strmRef.Close

set strmNew = fso.OpenTextFile("newlist.txt",1)
strNew = strmNew.ReadAll()
strmNew.Close

arrRef = split(lcase(strRef),vbCrLf)
arrNew = split(lcase(strNew),vbCrLf)

maxRef = ubound(arrRef)

for refIdx = 0 to ubound(arrRef)
    newIdx = 0
    do while newIdx < ubound(arrNew)
        if arrRef(refIdx) = arrNew(newIdx) then
            arrRef(refIdx) = arrRef(maxRef)
            arrRef(maxRef) = ""
            maxRef = maxRef - 1
            exit do
        end if
        newIdx = newIdx + 1
    loop
next

redim preserve arrRef(maxRef)

set strmRef = fso.OpenTextFile("ref.txt",2,true)
strmRef.Write(Join(arrRef, vbCrLf))
strmRef.Close
set fso = nothing
Avatar billede nbnielsen Nybegynder
01. september 2005 - 08:54 #3
Hej, tak for eksemplet, du har hjulpet mig rigtig meget.

Men, der er dog et issue.

Hvis ref.txt indeholder linierne:

test 1
...
test 6


og jeg så laver en newlist med linierne:

test 3
test 5

Så skulle den nye ref.txt jo indeholde:

test 1
test 2
test 4
test 6

men, den indeholder også test 5, som er sidste linie i newlist.txt

Hvorfor det?
Avatar billede softspot Forsker
01. september 2005 - 09:49 #4
Det er fordi jeg har lavet en fejl, idet jeg stopper gennemløbet af newlist en tand for tidlig

do while newIdx < ubound(arrNew)

skal være

do while newIdx <= ubound(arrNew)


i stedet... sorry :(
Avatar billede nbnielsen Nybegynder
01. september 2005 - 10:55 #5
Lav et svar :D

Du har reddet min dag.
Avatar billede softspot Forsker
01. september 2005 - 10:57 #6
Jamen, det er jeg da glad for at høre :)
Avatar billede softspot Forsker
01. september 2005 - 12:22 #7
Tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester