Avatar billede nbnielsen Nybegynder
20. september 2005 - 14:41 Der er 9 kommentarer og
3 løsninger

Sortere linierne i en txt fil, efter en anden fil som reference.

Er det muligt at sortere linierne i en txt fil, efter linierne i en anden fil, som reference?

FX:

Reference:
Foo1.boo
Foo2.boo
Foo3.boo
Goo1.boo
Goo2.boo
Goo3.boo

Min anden fil (den som skal sorteres) ser således ud:

Unsorted:
Foo2.boo
Goo1.boo
Goo2.boo
Foo3.boo


Er det så muligt at få den usorterede fil til at se sådan ud, efter en script har kørt:

Finish:
Foo2.boo
Foo3.boo
Goo1.boo
Goo2.boo


På forhånd mange tak.
Avatar billede softspot Forsker
21. september 2005 - 10:13 #1
Ja, hvis du kan opstille et regelsæt for hvordan det skal fungere, så kan det nok lade sig gøre. Det eksempel du viser her er jo ret simpelt, men hvad sker der hvis f.eks. den usorterede fil indeholder elementer, som ikke eksisterer i referencen, og i særdeleshed hvis referencen ikke er så regelret som den du har vist... f.eks.:

Reference
Goo1.boo
Foo3.boo
Foo1.boo
Goo3.boo
Goo2.boo
Foo2.boo

Unsorted:
Foo2.boo
Goo1.boo
Goo2.boo
Foo3.boo

Finish: ???

Hvordan skal finish så se ud???

M.a.o. indeholder den usorterede list ALTID kun et subsæt af det som referencen indeholder eller kan der være nye elementer (ifht. referencen) i den usorterede liste?

Hvis der ikke kan forekomme nye elementer i den usorterede liste, vil jeg egentlig bare gennemløbe referencen og spørge om elementet findes i den usorterede liste og hvis ikke så smide det væk. Dette gøres for hvert element. Resultatet er så den iflg. referencen sorterede liste...
Avatar billede nielsrs Nybegynder
22. september 2005 - 00:00 #2
Princippet i efterfølgende vbsprogram.

Der læses fra 2 filer,  reference  og  usorteret

For læses de usorterede og lægges i variablen u(.....) (der er plads til 10000 elementer.
Dernæst læses fra reference-filen, 1 ad gangen, og holdes op imod alle de usorterede elementer, hvis der er sammenfald mellem det usorterede og referencen, skrives til den sorterede fil, samtidig markeres det via variablen ok(.....) er elementet er fundet i referencefilen.

Til sidst kontrolleres de usorterede, og hvis der er elementer som IKKE har være i reference-filen, skrives disse i fejl-filen.

----------------------------------------------------
VBS-program
----------------------------------------------------

option explicit
dim fso, ref, sort, usort, x, y, u(10000), ok(10000), tl, emne
tl=0

Const ForReading = 1, ForAppending = 8
set fso = CreateObject ("Scripting.FileSystemObject")

set ref = fso.OpenTextFile("c:\reference.txt", ForReading)
set usort = fso.OpenTextFile("c:\usorteret.txt", ForReading)
set sort = fso.CreateTextFile("c:\sorteret.txt", True)
set fejl = fso.CreateTextFile("c:\fejllog.txt", True)
fejl.writeLine"Indeholder emner som ikke kunne sorteres"

do
  if usort.AtEndOfStream = True  then
      exit do
    else
      tl = tl + 1
      u(tl) = usort.readLine
      ok(tl) = 0 
  end if
loop
usort.close
do
  if ref.AtEndOfStream = True  then
      exit do
    else
      emne = ref.readLine
      for x = 1 to tl
        if emne = u(x) then
            sort.writeLine emne
            ok(x) = 1
        end if
      next 
  end if
loop

for x = 1 to tl
  if ok(x) = 0 then
      fejl.writeLine u(x)
  end if
next

sort.close
ref.close
msgbox"Programmet er afsluttet"
Avatar billede nbnielsen Nybegynder
22. september 2005 - 16:44 #3
softspot:

den usorterede fil kan kun indeholde data som eksisterer i referencen, så er den på plads.


nielsrs: dit script sorterer ikke ret meget :P
Avatar billede softspot Forsker
22. september 2005 - 18:57 #4
Så prøv denne udgave:

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

set strmSort = fso.OpenTextFile("unsorted.txt",1)
strSort = strmSort.ReadAll()
strmSort.Close

arrRef = split(strRef,vbCrLf)
arrSort = split(lcase(strSort),vbCrLf)

maxRef = ubound(arrRef)

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

' kondenser array, dvs. fjern tomme pladser
ptr = 0
for i = 0 to ubound(arrRef)
    if arrRef(i) <> "" and arrRef(ptr) = "" then
        arrRef(ptr) = arrRef(i)
        arrRef(i) = ""
        ptr = ptr + 1
    end if
    if arrRef(i) <> "" and arrRef(ptr) <> "" then
        ptr = ptr + 1
    end if
next

redim preserve arrRef(maxRef)

set strmRef = fso.OpenTextFile("sorted.txt",2,true)
strmRef.Write(Join(arrRef, vbCrLf))
strmRef.Close
set fso = nothing
Avatar billede nielsrs Nybegynder
23. september 2005 - 00:53 #5
Jeg havde ikke testet mit script, det har jeg nu og bortset fra, at "dim" linien skal rettes til....

dim fso, ref, sort, usort, x, y, u(10000), ok(10000), tl, emne, fejl

idet variablen fejl manglede, virkede det da perfekt, filen "sorteret.txt" indeholdt...


Foo2.boo
Foo3.boo
Goo1.boo
Goo2.boo

....var det ikke det den skulle??????
Avatar billede nbnielsen Nybegynder
23. september 2005 - 13:48 #6
Softspot. Skriv et svar.

Jeg vil give jer begge 75 fordi I har begge lært mig en del mht de der arrays :)
Avatar billede softspot Forsker
23. september 2005 - 13:51 #7
Jamen, så får du da et svar fra mig også :)

...men var det den løsning du havde behov for?
Avatar billede nielsrs Nybegynder
23. september 2005 - 16:19 #8
Det er ligesom at gå på landsarkivet i Viborg.

.....Det er utroligt hvad man kan finde, når man leder efter noget helt andet !!!!
Avatar billede softspot Forsker
23. september 2005 - 16:36 #9
nielsrs >> Hvad tænker du på...? :)
Avatar billede nielsrs Nybegynder
26. september 2005 - 08:57 #10
tja... nsnielsen spurgte om sortering og endte med at lære om arrays, i min it-afdeling kalder vi den situation "at gå på landarkivet i Viborg".... en intern vits :-)
Avatar billede nbnielsen Nybegynder
26. september 2005 - 09:35 #11
Det var softspots løsning jeg bedst kunne lide, for den gjorde præsis som jeg havde tænkt mig. Der var ik så meget lir eller pjat :P
Avatar billede softspot Forsker
26. september 2005 - 09:58 #12
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