Avatar billede mungojerrie Nybegynder
17. marts 2005 - 14:10 Der er 12 kommentarer og
1 løsning

Optimering af søgning i tekstfiler

Hej

Jeg har et lille søgeproblem jeg gerne vil have gjort hurtigere.

Jeg har to filer, som begge indeholder tekst linjer, hvor værdierne er kommasepareret

fil1:
70;4601058;......

fil2:
70;4601058;1;
70;4601058;2;
70;4601058;3;
70;4601106;1;

Ideen er at jeg kigger i fil1, linje for linje og udfra de to felter vist, kigger jeg så i fil2 efter de linjer der matcher med de to første værdier fra fil1. I dette tilfælde skal jeg altså "behandle" de tre første linjer i fil2

Idag benytter jeg en for løkke til formålet men når nu jeg står med 300 linjer i fil1 og 1700 linjer i fil2, så tager det lidt for lang tid......

Nogle gode ideer modtages gerne :-)
Avatar billede arne_v Ekspert
17. marts 2005 - 14:13 #1
Læs fil1 ind i en Hashtable og løb sekventelt igenne fil2 og slå op
i Hashtable.
Avatar billede mungojerrie Nybegynder
17. marts 2005 - 14:27 #2
kan jeg ikke undgå at "vende" min søgning rundt, således det stadig er min fil1 der er den bestemmende for hvad der søges efter... ???
Avatar billede arne_v Ekspert
17. marts 2005 - 14:30 #3
Du kan også læse fil2 ind i en Hashtable og gå sekventielt igennem fil1
Avatar billede mungojerrie Nybegynder
17. marts 2005 - 14:52 #4
måske skal jeg lige pointere at jeg har to "keys" i fil1, nemlig de to første værdier og jeg ved ikke helt om så en hashtable er god så ?
Avatar billede arne_v Ekspert
17. marts 2005 - 14:56 #5
Du kontanerer bare de to værdier og bruger resulatet som key
Avatar billede arne_v Ekspert
17. marts 2005 - 14:56 #6
konkatanerer
Avatar billede mungojerrie Nybegynder
17. marts 2005 - 15:56 #7
hmm, tror jeg er nødt til at forklare mit situation lidt mere.....

Fil1 indeholder :
"ID";"fakturanr";"flere data som er ubetydelig her";
70;4601058;xxxx;

Fil2 indeholder :
"ID", "fakturanr", "fakturalinje", "flere data "
70;4601058;1;"flere data";
70;4601058;2;"flere data"; <--- linje 2
70;4601058;3;"flere data";
70;4621408;1;"flere data";

Jeg har derfor lidt svært ved at se hvordan jeg skal kunne klare det med en hashtable, da jeg ikke kan tilføje til min
hashtable, hvis værdien findes der i forvejen. Det vil jo ske når jeg kommer til linje to i fil2, hvis jeg blot konkatenerer
"key1" med "key2" (70+4601058)
Avatar billede arne_v Ekspert
17. marts 2005 - 16:02 #8
Så kan du jo lade key 70+4601058 gemme en ArrayList eller et array af de linier der er
i fil2
Avatar billede mungojerrie Nybegynder
17. marts 2005 - 17:32 #9
kan du give et eksempel på det ?
Avatar billede arne_v Ekspert
17. marts 2005 - 19:08 #10
using System;
using System.IO;
using System.Collections;

public class SuperCollection
{
    private Hashtable map = new Hashtable();
    public void Load(string filename) {
        StreamReader sr = new StreamReader(filename);
        string line;
        while((line = sr.ReadLine()) != null)
        {
            string[] parts = line.Split(";".ToCharArray());
            string key = parts[0]+ "#" + parts[1];
            ArrayList lst = (ArrayList)map[key];
            if(lst == null)
            {
                lst = new ArrayList();
                map.Add(key, lst);
            }
            lst.Add(parts[3]);
        }
        sr.Close();
    }
    public int Count(string key)
    {
        ArrayList lst = (ArrayList)map[key];
        if(lst == null)
        {
            return 0;
        }
        else
        {
            return lst.Count;
        }
    }
    public string Item(string key, int n)
    {
        ArrayList lst = (ArrayList)map[key];
        if(lst == null)
        {
            return null;
        }
        else
        {
            return (String)lst[n];
        }
    }
}

class MainClass
{
   
    public static void Main(string[] args)
    {
        SuperCollection sc = new SuperCollection();
        sc.Load(@"C:\fil2.dat");
        for(int i = 0; i < sc.Count(70 + "#" + 4601058); i++)
        {
            Console.WriteLine(sc.Item(70 + "#" + 4601058, i));
        }
    }
}
Avatar billede mungojerrie Nybegynder
17. marts 2005 - 19:23 #11
super, det prøver jeg lige af i morgen
Avatar billede mungojerrie Nybegynder
21. marts 2005 - 14:24 #12
super!!!, det duer jo bare arne :-)

Nu er indlæsningen klaret på ca 7 sekunder

Smid lige et svar.....
Avatar billede arne_v Ekspert
21. marts 2005 - 17:00 #13
svar
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