Avatar billede irken Nybegynder
13. april 2006 - 00:27 Der er 13 kommentarer og
1 løsning

Parsing af ren text

Hej,

Jeg skal bruge et lille program eller evt. nogle hints til hvordan jeg kommer igen, til at parse en fil med disse data:

#OBJECT START
OBJECT_FIELD_GUID: 5
OBJECT_FIELD_TYPE: 6
OBJECT_FIELD_ENTRY: 7
#OBJECT END

#OBJECT START
OBJECT_FIELD_GUID: 1
OBJECT_FIELD_TYPE: 2
OBJECT_FIELD_ENTRY: 3
#OBJECT END

#OBJECT START
OBJECT_FIELD_GUID: 4
OBJECT_FIELD_TYPE: 6
OBJECT_FIELD_ENTRY: 34
#OBJECT END

Som i kan se er #OBJECT START starten på sektionen og #OBJECT END er slut. Det jeg skal bruge er de værdier imellem start/end, f.eks:

OBJECT_FIELD_GUID: 4

OBJECT_FIELD_GUID og 4, uden : tegnet.

Det problem jeg har er at jeg ikke ved hvordan jeg kommer videre efter at have fået de værdier, den skal jo gå videre til næste #OBJECT START/#OBJECT END sektion og parse dem også..

Tak for hjælpen,
Jørgen
Avatar billede irken Nybegynder
13. april 2006 - 00:31 #1
Det jeg bruger er bare:

        static void Main(string[] args)
        {
            try
            {
                StreamReader sr = new StreamReader("test.txt");

                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    if (line != "")
                    {
                        string[] data = line.Split((new  char[] {':'}));
                       
                        foreach (string s in data)
                            Console.WriteLine(s);
                    }
                }

                sr.Close();
            }
            catch (Exception E)
            {
                Console.WriteLine(E.Message);
            }

            Console.ReadLine();
        }

Den checker så ikke om #OBJECT START/#END er der.

Tak,
Jørgen
Avatar billede arne_v Ekspert
13. april 2006 - 00:33 #2
du laeser linier ind i wn while loekke

du tester paa hvad det er med 5 if statements inden i while loekken
og goer noget forskelligt i de 5 tilfaelde
Avatar billede irken Nybegynder
13. april 2006 - 00:36 #3
Nej.

Det var jo bare eksempler foroven. Der kan være 20 entries imellem #OBJECT_START/END, derfor skal jeg bruge en måde til at søge videre, og checke om #OBJECT_START/END forkommer.
Avatar billede arne_v Ekspert
13. april 2006 - 00:44 #4
saa 2 if'er til START og END plus end else til sidst som haandterer
alt det andet

men hvis ikke du har en komplet liste over hvad der kan vaere, hvordan vil du
saa have det leveret - i en Hashtable ?
Avatar billede irken Nybegynder
13. april 2006 - 00:51 #5
Jeg har en liste over hvad filen indeholder :-).

#OBJECT START
VALUE1:VALUE2
#OBJECT END

#OBJECT START
VALUE1:VALUE2
VALUE1:VALUE2
VALUE1:VALUE2
VALUE1:VALUE2
VALUE1:VALUE2
VALUE1:VALUE2
VALUE1:VALUE2
#OBJECT END


Altså, den skal jo bare søge efter "#OBJECT START", blive ved med at gå en linie ned, og så parse dem (VALUE1:VALUE2) indtil den finder #OBJECT END.

Jeg ved ikke hvordan jeg skal få den til at søge efter #OBJECT START.
Avatar billede arne_v Ekspert
13. april 2006 - 02:00 #6
jeg bixer lige et eksempel
Avatar billede irken Nybegynder
13. april 2006 - 02:07 #7
Mange tak :-)
Avatar billede arne_v Ekspert
13. april 2006 - 02:38 #8
using System;
using System.Collections;
using System.IO;

namespace E
{
    public class MyObject
    {
        private int guid;
        private int type;
        private int entry;
        public MyObject() : this(0, 0, 0)
        {
        }
        public MyObject(int guid, int type, int entry)
        {
            this.guid = guid;
            this.type = type;
            this.entry = entry;
        }
        public int Guid
        {
            get
            {
                return guid;
            }
            set
            {
                guid = value;
            }
        }
        public int Type
        {
            get
            {
                return type;
            }
            set
            {
                type = value;
            }
        }
        public int Entry
        {
            get
            {
                return entry;
            }
            set
            {
                entry = value;
            }
        }
        public override String ToString()
        {
            return ("[" + guid + "," + type + "," + entry + "]");
        }
    }
    public class MainClass
    {
        private const String START = "#OBJECT START";
        private const String END = "#OBJECT END";
        private const String GUID = "OBJECT_FIELD_GUID";
        private const String TYPE = "OBJECT_FIELD_TYPE";
        private const String ENTRY = "OBJECT_FIELD_ENTRY";
        public static void Main(string[] args)
        {
            ArrayList lst = new ArrayList();
            StreamReader sr = new StreamReader(@"C:\test.txt");
            String line;
            bool active = false;
            MyObject mo = null;
            while((line = sr.ReadLine()) != null)
            {
                if(line.StartsWith(START))
                {
                    active = true;   
                    mo = new MyObject();
                }
                else if(line.StartsWith(END))
                {
                    lst.Add(mo);
                    active = false;
                }
                else
                {
                    if(active)
                    {
                        string[] parts = line.Split(":".ToCharArray());
                        string key = parts[0].Trim();
                        string val = parts[1].Trim();
                        if(key.StartsWith(GUID))
                        {
                            mo.Guid = int.Parse(val);
                        }
                        else if(key.StartsWith(TYPE))
                        {
                            mo.Type = int.Parse(val);
                        }
                        else if(key.StartsWith(ENTRY))
                        {
                            mo.Entry = int.Parse(val);
                        }
                        else
                        {
                            throw new Exception("Unrecognized line " + line);
                        }
                    }
                }
            }
            sr.Close();
            for(int i = 0; i < lst.Count; i++)
            {
                Console.WriteLine(lst[i]);
            }
        }
    }
}
Avatar billede arne_v Ekspert
13. april 2006 - 02:38 #9
nu ved jeg ikke om du vil processe data på den måde, men det skulle gerne demonstrere
teknikken
Avatar billede irken Nybegynder
13. april 2006 - 03:20 #10
Hej,

Ja, lige bortset fra at du checker om linien er f.eks "OBJECT_FIELD_GUID", den skal jo bare blive ved med at parse linier indtil #END, men det kan jeg nok få den til da linierne er af samme format som OBJECT_FIELD_GUID, bare en anden tekst.

Mange tak :-).
Avatar billede irken Nybegynder
13. april 2006 - 03:20 #11
Ah, sådan.
Avatar billede irken Nybegynder
13. april 2006 - 03:22 #12
Hvordan er det lige jeg acceptere dit reply from et svar? Det her system er da lidt weird :-).
Avatar billede arne_v Ekspert
13. april 2006 - 04:31 #13
jeg skal ligge et svar
Avatar billede irken Nybegynder
13. april 2006 - 04:34 #14
Sådan! Mange tak :-)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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