IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Parser, psy a kočky... HELP

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Dog
Člen
Avatar
Dog:10.7.2016 20:08

Ahoj,

mám problém s parserem, jde o vytáhnutí dat asi z 50k řádků za hodinu (log). Potřebuji to v live streamu, což už všechno mám mám už dokonce i analýzu, ale problém je, že mám vzorek 50k řádků a na něm je přesně 277 koček, mě se podařilo vytáhnout jen 263. Popíšu problém.

Dám příklad, jak data vypadají

kočka 22 -> data ktery chci vytahnout //to už mám všechno napsaný správně
pes 22 -> data
pes 22 -> data
pes 22 -> data
kočka 47 -> data
pes 47 -> data
pes 47 - > data

  • koček je přesnej počet 277 a ke každé kočce potřebuji přiřadit a předat třídě prvního psa pod stejným číslem.

kocka 22
pes 22
kocka 47
pes 47

Problém je, že někdy jsou data např. takhle
kocka 55
kocka 57
pes 57
pes 55
pes 55
pes 57
a takhle třeba náhodně
Ale vždy je pes po kočce.

A někdy výjimečně se stane, že chybí pes, takže kočka je, ale nemá se s čím sparovat. To ale nevadí.

Mám to pres FileStream, ale nechapu, že to nevrací x = název.position, nazev.seek (x, orig. begin) takové jaké předávám.
Mám dva parsery, první vytahuje kočky a psy z logfile a další ten, se kterým se teď trápím a který popisuji z nich dělá to co potřebuji...

FileStream fr1 = new FileStream("log.txt", FileMode.Open, FileAccess.ReadWrite);
StreamReader reader1 = new StreamReader(fr1);

string text1;
string[] textarr = { };
string[] textarr1 = { };
string[] textarr2 = { };

bool ToF = false;

while (reader1.EndOfStream == false)
{
    if (ToF == true)
    {
        fr1.Seek(pos009, SeekOrigin.Begin);
        ToF = false;
    }

    text1 = reader1.ReadLine();

    if (text1.Contains("kocka"))
    {
        textarr = text1.Split(' ');
        x++;
        o++;
        IDc[x] = textarr[4];
        card1[x] = textarr[6];
        card2[x] = textarr[8];
        if ((textarr[6].EndsWith("s") == textarr[8].EndsWith("s")) && (textarr[6].EndsWith("d") == textarr[8].EndsWith("d"))
            && (textarr[6].EndsWith("h") == textarr[8].EndsWith("h")) && (textarr[6].EndsWith("c") == textarr[8].EndsWith("c")))
            suited[x] = true;
        else
            suited[x] = false;
        listBox2.Items.Add(x + "\t" + textarr[2] + "\t" + textarr[4] + "\t" + textarr[6] + " " + textarr[8] + "\t" + suited[x]);


        text1 = reader1.ReadLine();
        while (reader1.EndOfStream == false)
        {
            if (text1.Contains("pes") && text1.Contains(textarr[4]))
            {
                textarr1 = text1.Split(' ');
                if (string.Equals(textarr1[9], "'W'"))
                {
                    listBox2.Items.Add(x + "\t" + textarr1[2] + "\t" + textarr[4] + "\t" + "noaction");
                    stav[x] = 0;
                    IDs[x] = textarr1[4];
                }
                else if (text1.Contains("'*'"))
                {
                    textarr1[16] = textarr1[16].Remove(textarr1[16].Length - 1);
                    textarr1[15] = textarr1[15].Remove(textarr1[15].Length - 1);
                    listBox2.Items.Add(x + "\t" + textarr1[2] + "\t" + textarr[4] + "\t" + textarr1[15] + ", " + textarr1[16]);
                    stav[x] = 1;
                    IDs[x] = textarr1[4];
                    stack[x] = int.Parse(textarr1[15]);
                    bb[x] = int.Parse(textarr1[16]);
                }
                else
                {
                    listBox2.Items.Add(x + "\t" + textarr1[2] + "\t" + textarr[4] + "\t" + textarr1[10]);
                    stav[x] = 2;
                    tocall[x] = int.Parse(textarr1[10]);
                    bb[x] = bb[x - 1];
                }
                break;
            }
            else if (text1.Contains("kocka"))
            {
                pos009 = fr1.Position - text1.Length;   //chyba 1. tuhletu pozici to nastavi nekam uplne do hoven asi o 15 radku pod onoho psa, od kteryho potebuji zacit nasledujíci cyklus

                listBox2.Items.Add(pos009 + " " + text1);
                text1 = reader1.ReadLine();
                ToF = true;
            }
            else
            {

                text1 = reader1.ReadLine();

                //tady potřebuji, aby to sem skočilo třeba když tam nebude žádnej pes, kterej by se mohl sparovat a přeskočilo ho to...
            // program zastavi přidávání psů jakmile narazí na kocku, která nemá psa
            //protože ho to hledá tak dlouho, dokud není na eof, což je samozřejmě špatně
            }
        }

        m = 0;
    }
}
Editováno 10.7.2016 20:09
 
Odpovědět
10.7.2016 20:08
Avatar
Dog
Člen
Avatar
Dog:10.7.2016 20:17

NEVŠÍMEJTE SI VŮBEC TECH PARSOVACICH METOD (ty jsou všechny spávně) JEN PODMÍNEK A VRACENÍ POZICE
Takže potřebuji prostě, aby to vzalo všech 277 koček a k nim přiřadilo prvního psa se stejným číslem :-)
Někdy můžou být i např 3 kočky pod sebou :(

 
Nahoru Odpovědět
10.7.2016 20:17
Avatar
hj.masek
Člen
Avatar
hj.masek:11.7.2016 0:24

Ahoj, muzu se zeptat opakuje se nekdy ID kocky? A pokud ano co se ma stat? a nebo je vzdy kocka unikatni a jen pes se opakuje? :) Diky

 
Nahoru Odpovědět
11.7.2016 0:24
Avatar
Dog
Člen
Avatar
Dog:11.7.2016 0:25

Tak už po 3 dnech dumání a myslení si, že je moje logika uplne v haji vím čím to je..** Je to tím, že mi pos009 = fr1.Position zobrazuje jen násobky 1024**, takže pozice nefungují, neví někdo jak to vyřešit?

pozice hned prvního řádku je 1024 a potom po 10ti kočkách je už 2048 a tak dále... Jestli mi někdo pomůže vyřešit tohle tak si s tím parserem už poradím :-) Když jsem vracel pozici, tak to samozřejmě vrátilo na úplnej nesmysl, kterej byl někde v intervalu 1024.

To by bylo abych neuměl vyhledat kočku, potom příslušnýho psa, vrátit pozici a znovu :-)

Díky moc!!!

Editováno 11.7.2016 0:27
 
Nahoru Odpovědět
11.7.2016 0:25
Avatar
Dog
Člen
Avatar
Odpovídá na hj.masek
Dog:11.7.2016 0:43

Kocka je vzdy jen jedna unikatni, pes se opakuje.

 
Nahoru Odpovědět
11.7.2016 0:43
Avatar
hj.masek
Člen
Avatar
hj.masek:11.7.2016 0:45

A data vypadaji takhle? napr, nic vic?
kocka 5
pes 8
pes 5
kocka 1
pes 1

 
Nahoru Odpovědět
11.7.2016 0:45
Avatar
Dog
Člen
Avatar
Dog:11.7.2016 0:57

Ano :)
Pes je vždy po kočce, která je jen jedna
čísla jsou vždy jiná a jdou vzestupně
např.
kocka 1
kocka 2
pes 1
pes 1
pes 2
pes 2
pes 1
kocka 3
pes 3
pes 3
pes 3
kocka 4
pes 3
kocka 5
pes 4
pes 4
pes 5
pes 4
pes 5

apod. Vždy vyhledat kočku x a k ní přiřadit prvniho psa x, vrátit pozici za kocku x a hledat dalsi kocku y a hned prvního psa y a tak stále dokola, s tím, že se může stát, že v jednom z 100 případů bude úplně chybět kočce z pes z a tím je nutno počítat.

Jak říkám, myslím, že bych si už poradil s tím parserem, ale nechápu, proč pozice vrací takový nesmysly jak jsem popsal v 4. příspěvku :-)

I tak díky moc!

 
Nahoru Odpovědět
11.7.2016 0:57
Avatar
hj.masek
Člen
Avatar
hj.masek:11.7.2016 3:44

Ahoj nevim jestli to tak presne chces, ale pokud rikas

Takže potřebuji prostě, aby to vzalo všech 277 koček a k nim přiřadilo prvního psa se stejným číslem

Tak presne tohle mi vydal tenhle kod, je to tak nak uplne jiny nez to tvoje, ale mozna pomuze :)
PS: ano je tam par veci co by se dali udelat lip a rad si poslechnu rady dekuji :)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DogCatParser
{
    class Program
    {
        static void Main(string[] args)
        {
            //nacteme soubor
            string fileName = "inputFile.txt";
            List<string> lines = new List<string>();
            using (StreamReader sr = File.OpenText(fileName))
            {
                while (!sr.EndOfStream)
                {
                    lines.Add(sr.ReadLine());
                }
            }
            //pro lehkou praci s tema ID si pripravime dictionary s ID a vlastnim objektem Animal
            //list jsem take premyslel, ale literace listu s Xtisic prvku je pomalejsi nez dictionart try get value

            Dictionary<int, Animal> cats = new Dictionary<int, Animal>();
            Dictionary<int, Animal> dogs = new Dictionary<int, Animal>();

            //parsovani
            foreach (var item in lines)
            {
                string[] nameAndId = item.Split(' ');
                if (nameAndId.Length == 2)
                {
                    //pripravime si jmeno a id; kocka 5, pes 2 atd
                    string name = nameAndId[0];
                    int ID;
                    int.TryParse(nameAndId[1], out ID);
                    Animal animal;
                    if (name == "kocka")
                    {
                        //pokud kocky NEOBSAHUJI toto ID tak pridame kocku s ID
                        if (!cats.TryGetValue(ID, out animal))
                        {
                            cats.Add(ID, new Animal(name, ID));
                        }
                    }
                    else if (name == "pes")
                    {
                        //pokud pejskove NEOBSAHUJI toto ID tak pridame pejska s ID
                        if (!dogs.TryGetValue(ID, out animal))
                        {
                            dogs.Add(ID, new Animal(name, ID));
                        }
                    }
                    //protoze jedeme postupne tak se zbavime duplikatu jako je pes 1, pes 1 atd.. vzdy ten PRVNI a to stejne u kocky
                }
            }
            foreach (var item in cats)
            {

                int ID = item.Key;
                Animal animal;
                //zjistime zda existuje pejsek co ma stejne ID jako kocka, pokud ano pridame to kocce jako subanimal :)
                if (dogs.TryGetValue(ID, out animal))
                {
                    item.Value.SubAnimal = animal;
                }
            }
            //test probehl na 200 tisic zaznamu absolutne bez problemu, pokud bys mel mozna slozitejsi objekty nebo miliony zaznamu mozna by byl rychlejsi  Parallel.For
            //priklad vysledku timhle parsovanim
            //[3]
            // Key 4
            // Value
            // ID               4
            // Name             kocka
            // SubAnimal
            //           ID 4
            //           Name pes
            //           SubAnimal null
        }
    }

    class Animal
    {
        public string Name { get; set; }

        //ID by nemuselo byt protoze to mame ve slovniku co bude mit take stejny ID, mozna zbytecne duplikuju 2 inty
        //ale je to pro pripad ze bys to chtel mit zachovany, at uz z jakehokoliv duvodu
        public int ID { get; set; }
        public Animal SubAnimal { get; set; }
        public Animal(string Name, int ID)
        {
            this.Name = Name;
            this.ID = ID;
        }
    }

}
 
Nahoru Odpovědět
11.7.2016 3:44
Avatar
hj.masek
Člen
Avatar
hj.masek:11.7.2016 4:08

Jinak chybu ti zpusobuje StreamReader, pokud se nepletu ma buffer aby byl efektivni 1024 a ReadLine udela tento skok, proto mas ty nasobky...

 
Nahoru Odpovědět
11.7.2016 4:08
Avatar
Dog
Člen
Avatar
Dog:11.7.2016 11:51

Dobře, díky moc, problém je, že já vůbec neovládám kolekce apod. mám teď hodně učení takže se k tomu asi nedostanu.

Vůbec netuším odkud mám volat ten výslednej objekt. Jako kočky a psy.
Ono je to ještě trošku složitější, ty kočky a psi jsem tam dal jen kvůli přehlednosti, výsledek po projetí prvním parserem vypadá nějak takto...

221 -> MSG_0x0009-T 2054131054 00A4DE5D ::: 10d ::: 13s
221 -> MSG_0x0007-T 2054131054 00A4DE5D 'F' 65536 'C' 287
221 -> MSG_0x0007-T 2142451585 00A12320 'F' 65536 'C' 40 '' 'E' 80, 370, 20, 1
222 -> MSG_0x0009-T 2054131054 00A4DE5D ::: 13s ::: 7h
222 -> MSG_0x0007-T 2054131054 00A4DE5D 'F' 65536 'C' 15 '
' 'E' 60, 634, 30, 1
222 -> MSG_0x0007-T 2054131054 00A4DE5D 'w' 0 'W' 65536
223 -> MSG_0x0009-T 2142451585 00A12320 ::: 5h ::: 2c
224 -> MSG_0x0009-T 2054131054 00A4DE5D ::: 4d ::: 8c
224 -> MSG_0x0007-T 2142451585 00A12320 'F' 65536 'C' 15 '' 'E' 60, 370, 30, 1
224 -> MSG_0x0007-T 2054131054 00A4DE5D 'F' 65536 'C' 306
224 -> MSG_0x0007-T 2142451585 00A12320 'w' 0 'W' 65536
225 -> MSG_0x0009-T 2142451585 00A12320 ::: 12d ::: 10h
226 -> MSG_0x0009-T 2054131054 00A4DE5D ::: 2s ::: 6h
226 -> MSG_0x0007-T 2054131054 00A4DE5D 'F' 65536 'C' 15 '
' 'E' 60, 638, 30, 1
226 -> MSG_0x0007-T 2142451585 00A12320 'F' 65536 'C' 30 '' 'E' 90, 410, 30, 1
226 -> MSG_0x0007-T 2142451585 00A12320 'F' 65536 'c' 0 '
' 'B' 30, 340, 30, 1
226 -> MSG_0x0007-T 2054131054 00A4DE5D 'w' 0 'W' 65536
227 -> MSG_0x0009-T 2054131054 00A4DE5D ::: 11h ::: 11s
227 -> MSG_0x0007-T 2142451585 00A12320 'F' 65536 'C' 90 '' 'E' 180, 340, 30, 1
227 -> MSG_0x0007-T 2054131054 00A4DE5D 'F' 65536 'c' 0 '
' 'E' 60, 664, 30, 1
227 -> MSG_0x0007-T 2054131054 00A4DE5D 'w' 0 'W' 65536
228 -> MSG_0x0009-T 2054131054 00A4DE5D ::: 14h ::: 10c
228 -> MSG_0x0007-T 2054131054 00A4DE5D 'F' 65536 'C' 15 '' 'E' 60, 694, 30, 1
228 -> MSG_0x0007-T 2142451585 00A12320 'F' 65536 'c' 0 '
' 'B' 30, 250, 30, 1
228 -> MSG_0x0007-T 2142451585 00A12320 'F' 65536 'c' 0 '' 'B' 30, 250, 30, 1
228 -> MSG_0x0007-T 2054131054 00A4DE5D 'F' 65536 'c' 0 '
' 'B' 30, 664, 30, 1
228 -> MSG_0x0007-T 2054131054 00A4DE5D 'F' 65536 'c' 0 '' 'B' 30, 664, 30, 1
228 -> MSG_0x0007-T 2054131054 00A4DE5D 'F' 65536 'c' 0 '
' 'B' 30, 664, 30, 1
229 -> MSG_0x0009-T 2142451585 00A12320 ::: 5h ::: 4h
229 -> MSG_0x0007-T 2142451585 00A12320 'F' 65536 'C' 15 '' 'E' 60, 250, 30, 1
229 -> MSG_0x0007-T 2054131054 00A4DE5D 'F' 65536 'c' 0 '
' 'E' 80, 664, 40, 1
229 -> MSG_0x0007-T 2142451585 00A12320 'w' 0 'W' 65536
230 -> MSG_0x0009-T 2142451585 00A12320 ::: 5h ::: 14d
230 -> MSG_0x0007-T 2142451585 00A12320 'F' 65536 'C' 30 '*' 'E' 90, 280, 30, 1
230 -> MSG_0x0007-T 2054131054 00A4DE5D 'w' 0 'W' 65536

  • z čehož číslo nazačátku je počet koček (MSG_0x0009-T) (to jsem tam doplnil já jen pro orientaci)
  • MSG_0x0009-T je myšleno jako kočka, která je unikátní
  • MSG_0x0007-T je myšleno jako pes, který je vždy vícekrát
  • dvě čísla zatím jsou myšlena jako číslo u psa nebo kočky, je jedno jaké si vyberete, jsou vždy stejná u psa i kočky

např.
225 -> MSG_0x0009-T 2142451585 00A12320 ::: 12d ::: 10h
by se mělo spárovat s:
226 -> MSG_0x0007-T 2142451585 00A12320 'F' 65536 'C' 30 '*' 'E' 90, 410, 30, 1

a

229 -> MSG_0x0009-T 2142451585 00A12320 ::: 5h ::: 4h
by se mělo spárovat s:
229 -> MSG_0x0007-T 2142451585 00A12320 'F' 65536 'C' 15 '*' 'E' 60, 250, 30, 1

  • data za temi dvěma čísly potřebuji odeslat do mé třídy, samozřejmě v polích a osekány o uvozovky v intu apod... Ta se už postará o všechno ostatní :-)

konstruktor třídy vyžaduje data u prvního příkladu tučně (s '*'), když je první pes s 'W', tak nevyžaduje nic a když je první cokoli jiného tak, vyžaduje ještě číslo před těmi dvěma v prvním příkladu.

Z toho co si postavil ty bohužel moc nevím :( Netuším jak to volat apod...

Díky moc za tvoji pomoc, ale budu jí pravděpodobně potřebovat ještě trošku :-)

Editováno 11.7.2016 11:54
 
Nahoru Odpovědět
11.7.2016 11:51
Avatar
hj.masek
Člen
Avatar
hj.masek:11.7.2016 13:53

Ahoj :)
Predelal jsem to trosku a pocitam s tim ze plati

Jak říkám, myslím, že bych si už poradil s tím parserem

takze staci si uz nejak zpracovat RawData v kazde kocce neboli zprave 009-T

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DogCatParser
{
    class Program
    {
        static void Main(string[] args)
        {
            //nacteme soubor
            string fileName = "inputFile.txt";
            List<string> lines = new List<string>();
            using (StreamReader sr = File.OpenText(fileName))
            {
                while (!sr.EndOfStream)
                {
                    lines.Add(sr.ReadLine());
                }
            }
            //pro lehkou praci s tema ID si pripravime dictionary s ID a vlastnim objektem MessageLog
            //list jsem take premyslel, ale literace listu s Xtisic prvku je pomalejsi nez dictionart try get value

            //kocky
            Dictionary<string, MessageLog> MSG_0x0009T = new Dictionary<string, MessageLog>();

            //psy
            Dictionary<string, MessageLog> MSG_0x0007T = new Dictionary<string, MessageLog>();

            //parsovani
            foreach (var item in lines)
            {
                //zde mame radek napr 222 -> MSG_0x0007-T 2054131054 00A4DE5D 'F' 65536 'C' 15 '' 'E' 60, 634, 30, 1
                string lineToParse = item;
                //zbaveni se sipek a mezer a jinych znaku za tim - vse oddeleno jednou mezerou snad / pokud data vypadaji jinak musis si to opravit
                lineToParse = lineToParse.Replace("-> ", "");
                lineToParse = lineToParse.Replace("::: ", "");
                lineToParse = lineToParse.Replace("'' ", "");
                lineToParse = lineToParse.Replace("'", "");
                lineToParse = lineToParse.Replace(",", "");


                string[] rawValues = lineToParse.Split(' ');
                int countOfLog;
                int.TryParse(rawValues[0], out countOfLog);
                string messageType = rawValues[1];
                string ID = rawValues[2]; //je prej teda jedno jake takze by slo i rawValues[3]
                string rawDataForParsing = "";
                for (int i = 3; i < rawValues.Length; i++)
                {
                    //data jsou i s ID druheho typu, pokud nepotrbujes zmen startovni index z 3 na 4 :)
                    //podminka aby na konci nebyla mezera.. kdyby ti to nejak vadilo
                    if (i != rawValues.Length - 1)
                    {
                        rawDataForParsing += rawValues[i] + " ";
                    }
                    else
                    {
                        rawDataForParsing += rawValues[i];
                    }
                }


                MessageLog messageLog;

                if (messageType == "MSG_0x0009-T")
                {
                    //pokud jakoby kocky NEOBSAHUJI toto ID tak pridame kocku s ID
                    if (!MSG_0x0009T.TryGetValue(ID, out messageLog))
                    {
                        MSG_0x0009T.Add(ID, new MessageLog(ID, countOfLog, rawDataForParsing));
                    }
                }
                else if (messageType == "MSG_0x0007-T")
                {
                    //pokud jakoby pejskove NEOBSAHUJI toto ID tak pridame pejska s ID
                    if (!MSG_0x0007T.TryGetValue(ID, out messageLog))
                    {
                        //vsiml jsem si ze prikladu co si prilozil vznikala jedna vec u ktere si nejsem jisty CTI POZORNE
                        //existuje napr ID psa co je stejne jako kocka, ale PES JE PRVNI..
                        //takze vzit hodnotu prvni v souboru -- to mi prislo divne
                        //takze takhle podminka dela ze musi vzdy existovat kocka nez se muze vytvorit zprava typu psa se stejnym ID
                        // neboli PES BUDE VZDY pod kockou
                        // pokud nechces staci smazat tu podminka..
                        MessageLog tempLog;
                        if (MSG_0x0009T.TryGetValue(ID, out tempLog))
                        {
                            MSG_0x0007T.Add(ID, new MessageLog(ID, countOfLog, rawDataForParsing));
                        }
                    }
                }
                //protoze jedeme postupne tak se zbavime duplikatu jako je pes 1, pes 1 atd.. vzdy ten PRVNI a to stejne u kocky

            }
            foreach (var message in MSG_0x0009T)
            {
                //klasicke prirazeni koccka k psovi..
                string ID = message.Key;
                MessageLog subLog;
                if (MSG_0x0007T.TryGetValue(ID, out subLog))
                {

                    message.Value.subMessageLog = subLog;
                }
            }



            //Ted to mas prirazeny k sobe jak chces.. pokud existuje zprava pod kockou se stejnym ID tak je v subLogu, zadny se neopakuje atd
            //Ted musis si udelat ten tvuj parsing, mas to pripraveny v objektu tak ze to zvladnes :)
            //priklad
            foreach (var messageLog in MSG_0x0009T)
            {
                Console.WriteLine("====================");
                Console.WriteLine("KOCKA");
                Console.WriteLine("___________________");
                var message = messageLog.Value;
                //to prvni ID :)
                Console.WriteLine(message.ID);
                //to cislo co bylo pred sipkou
                Console.WriteLine(message.CountOfLog);
                //DATA NA ZPRACOVANI -- KOCKA !!!!
                Console.WriteLine(message.RawData);
                Console.WriteLine("___________________");
                //pokud vubec ma k sobe pejska
                if (message.subMessageLog != null)
                {
                    Console.WriteLine("PES");
                    Console.WriteLine("___________________");
                    //zase to ma ID, CountOfLog
                    //DATA NA ZPRACOVANI PES s kontrolou
                    Console.WriteLine(message.subMessageLog.RawData);
                    Console.WriteLine("___________________");
                }
            }
        }
    }

    class MessageLog
    {


        //ID by nemuselo byt protoze to mame ve slovniku co bude mit take stejny ID, mozna zbytecne duplikuju 2 inty
        //ale je to pro pripad ze bys to chtel mit zachovany, at uz z jakehokoliv duvodu
        public string ID { get; set; }
        public int CountOfLog { get; set; }  //pocet? nevim muzes prejmenovat
        public string RawData { get; set; }
        public MessageLog subMessageLog { get; set; }
        public MessageLog(string ID, int CountOfLog, string RawData)
        {
            this.ID = ID;
            this.CountOfLog = CountOfLog;
            this.RawData = RawData;
        }
    }

}
 
Nahoru Odpovědět
11.7.2016 13:53
Avatar
hj.masek
Člen
Avatar
hj.masek:11.7.2016 13:56

Tohle jsou data co mas v RawData napr u sublogu (psa)
presny string:
00A12320 F 65536 C 15 * E 60 370 30 1

 
Nahoru Odpovědět
11.7.2016 13:56
Avatar
Dog
Člen
Avatar
Dog:11.7.2016 17:54

Okej teď nejsem doma. Až budu tak na to určitě mrknu a pošlu ti nějakej drobak na pivo za ochotu :-)
Díky moc!

 
Nahoru Odpovědět
11.7.2016 17:54
Avatar
Dog
Člen
Avatar
Dog:11.7.2016 23:37

Tak tento parser vytáhne a přiřadí bohužel jen 16 koček k 16 psům z 277 :(

 
Nahoru Odpovědět
11.7.2016 23:37
Avatar
hj.masek
Člen
Avatar
hj.masek:12.7.2016 0:12

I kdyby mel chybu nejakou tak se aspon nejaky kocky vytahnou.. zkousel jsem to a proste neopakuji se ti strasne ockrat ID? ze jich mas doopravdy jen 16 unikatnich?

 
Nahoru Odpovědět
12.7.2016 0:12
Avatar
Dog
Člen
Avatar
Dog:12.7.2016 0:33

Aha.... Podělal jsem to v zadání :( Omlouvám se!!!

Myslel jsem, že tím unikátních myslíš jako že je vždy jen jedna kočka na několik psů a že ke každé kočce musí být přiřazen jeden pes.

17 je jich unikátních, jako ve smyslu kocka 1, kocka 2, kocka 3 (kocka a jiné číslo) apod... A vytáhne to přesně 17 koček a 17 psů. což je 100% :)

zbytek jsou třeba kocka 1, kocka 1, kocka 1, ale ty jsou také důležité :(

dejme tomu, ze je to takhle
kocka 1
kocka 2
pes 1 //priradit kocce 1
pes 2 //priradit kocce 2
pes 1
pes 2
kocka 1
pes 2
kocka 2
pes 1 ////priradit druhe kocce 1
pes 1
pes 2 ///priradit druhe kocce 2
kocka 1
pes 2
pes 2
kocka 3
pes 1 //priradit treti kocce 1
kocka 2
pes 3 //priradit kocce 3
pes 3
pes 2
pes 2

ve smyslu kocka 1, kocka 2 jsou z totoho unikatni jen 3, ale vypsanych jich má být 6 ...

ten parser vytahuje jen unikátní kočky :) , což by vytáhlo jen strašně málo dat, potřebuji vytáhnout právě všechny kočky a k nim přiřadit prvního psa se stejným číslem kterej je pod nimi :)

mojee chyba v pochopení :(

Editováno 12.7.2016 0:33
 
Nahoru Odpovědět
12.7.2016 0:33
Avatar
hj.masek
Člen
Avatar
hj.masek:12.7.2016 2:55

Dobra uz jsem to musel trosinku zmenit a nemohl jsem pouzit slovnikovy system..
takze testoval jsem to na 56000 zaznamu --- OBE KOLEKCE dohromady toto cislo dali - to znamena ze kocky to projelo doopravdy vsechny
Jinak pes byl vzdy ten nejblizsi pod kockou..
Pri testu z toho co si pridal ty viz tech asi 35 zprav - tak 10 kocek - ODPOVIDA a k tomu 25 psu z nich se ovsem priradili jen ty spravne takze 10 kocek a 10 psu :)
snad uz je to ono :)

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DogCatParser
{
    class Program
    {
        static void Main(string[] args)
        {
            //nacteme soubor
            string fileName = "inputFile.txt";
            List<string> lines = new List<string>();
            using (StreamReader sr = File.OpenText(fileName))
            {
                while (!sr.EndOfStream)
                {
                    lines.Add(sr.ReadLine());
                }
            }

            //dictionary nemuze mit stejne klice, takze muj ID system nejde pokud ma platit to tvoje nove zadani :), proto pouzijem listy / slo by to do jednoho, orientace ve 2 je lehci

            //kocky
            List<MessageLog> MSG_0x0009T = new List<MessageLog>();

            //psy
            List<MessageLog> MSG_0x0007T = new List<MessageLog>();
            //toto je nova promenna, dulezita
            int lineID = 0;
            //parsovani
            foreach (var item in lines)
            {
                //zde vse zustalo stejne
                //zde mame radek napr 222 -> MSG_0x0007-T 2054131054 00A4DE5D 'F' 65536 'C' 15 '' 'E' 60, 634, 30, 1
                string lineToParse = item;
                //zbaveni se sipek a mezer a jinych znaku za tim - vse oddeleno jednou mezerou snad / pokud data vypadaji jinak musis si to opravit
                lineToParse = lineToParse.Replace("-> ", "");
                lineToParse = lineToParse.Replace("::: ", "");
                lineToParse = lineToParse.Replace("'' ", "");
                lineToParse = lineToParse.Replace("'", "");
                lineToParse = lineToParse.Replace(",", "");


                string[] rawValues = lineToParse.Split(' ');
                int countOfLog;
                int.TryParse(rawValues[0], out countOfLog);
                string messageType = rawValues[1];
                string ID = rawValues[2]; //je prej teda jedno jake takze by slo i rawValues[3]
                string rawDataForParsing = "";
                for (int i = 3; i < rawValues.Length; i++)
                {
                    //data jsou i s ID druheho typu, pokud nepotrbujes zmen startovni index z 3 na 4 :)
                    //podminka aby na konci nebyla mezera.. kdyby ti to nejak vadilo
                    if (i != rawValues.Length - 1)
                    {
                        rawDataForParsing += rawValues[i] + " ";
                    }
                    else
                    {
                        rawDataForParsing += rawValues[i];
                    }
                }
                //vzdy pridame do 1 ze 2 listu
                if (messageType == "MSG_0x0009-T")
                {
                    MSG_0x0009T.Add(new MessageLog(lineID, ID, countOfLog, rawDataForParsing));
                }
                else if (messageType == "MSG_0x0007-T")
                {
                    MSG_0x0007T.Add(new MessageLog(lineID, ID, countOfLog, rawDataForParsing));
                }
                lineID++;
            }
            //prirazovani kocka-pes
            for (int i = 0; i < MSG_0x0009T.Count; i++)
            {
                var message = MSG_0x0009T[i];
                MessageLog messageLog;
                //vlastni tryparse metoda
                //funguje to jako tryparse :) zakladne metoda vraci true nebo false ale nez vrati BOOL tak nastavi OUT promenou na MessageLog ci null
                if (TryGetMessageLogWithSameID(MSG_0x0007T, message.ID, message.LineID, out messageLog))
                {
                    message.subMessageLog = messageLog;
                }
            }

            //opet vypis pro ukazku
            foreach (var messageLog in MSG_0x0009T)
            {
                Console.WriteLine("====================");
                Console.WriteLine("KOCKA");
                Console.WriteLine("___________________");
                var message = messageLog;
                //to prvni ID :)
                Console.WriteLine(message.ID);
                //to cislo co bylo pred sipkou
                Console.WriteLine(message.CountOfLog);
                //DATA NA ZPRACOVANI -- KOCKA !!!!
                Console.WriteLine(message.RawData);
                Console.WriteLine("___________________");
                //pokud vubec ma k sobe pejska
                if (message.subMessageLog != null)
                {
                    Console.WriteLine("PES");
                    Console.WriteLine("___________________");
                    //zase to ma ID, CountOfLog
                    //DATA NA ZPRACOVANI PES s kontrolou
                    Console.WriteLine(message.subMessageLog.RawData);
                    Console.WriteLine("___________________");

                }
            }
            Console.ReadKey();
        }
        public static bool TryGetMessageLogWithSameID(List<MessageLog> msg007, string ID, int lineID, out MessageLog log)
        {
            //pokud maji stejne ID tak super ale zaroven to musi byt PRVNI POD NIM
            //proto si zachovavame kolikaty je to radek v LineID
            //to znamena ze pes musi mit vzdy vetsi hodnotu radku -- to znamena neprida to kocce psa se stejnym id co uz mela jina kocka nad tim.. vzdy bude pod
            for (int i = 0; i < msg007.Count; i++)
            {
                var message = msg007[i];
                if (message.ID == ID && message.LineID > lineID)
                {

                    log = message;
                    return true;
                }
            }
            log = null;
            return false;
        }
    }


    class MessageLog
    {
        public string ID { get; set; }
        public int CountOfLog { get; set; }
        public string RawData { get; set; }
        public MessageLog subMessageLog { get; set; }
        public int LineID { get; set; } // kolikaty je to radek v souboru!
        public MessageLog(int LineID, string ID, int CountOfLog, string RawData)
        {
            this.ID = ID;
            this.CountOfLog = CountOfLog;
            this.RawData = RawData;
            this.LineID = LineID;
        }
    }
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
12.7.2016 2:55
Avatar
Dog
Člen
Avatar
Dog:12.7.2016 22:27

Zdá se, že funguje, ale nevím ještě jsem to moc nezkoumal, protože mám strašně moc učení na zítřek...

Díky moc a až to odzkouším, tak dám vědět :-)

 
Nahoru Odpovědět
12.7.2016 22:27
Avatar
Dog
Člen
Avatar
Dog:13.7.2016 17:34

Funfuje parádně... Pošli mi prosím ČÚ do zpráv :-) Pošlu ti tam něco na pivo :-)

 
Nahoru Odpovědět
13.7.2016 17:34
Avatar
Dog
Člen
Avatar
Dog:14.7.2016 18:48

Neví někdo jak nastavit ten kod tak, aby si pamatoval "přesnou" pozici kde skončil se četním v logu???

FileStream logs = new FileStream("log.txt", FileMode.Open, FileAccess.ReadWrite);
            StreamReader reader1 = new StreamReader(logs);

            logs.Seek(logpos1, SeekOrigin.Begin);

            while (!reader1.EndOfStream)
            {
                lines.Add(reader1.ReadLine());
            }
            logpos1 = logs.Position;

Tohle nastavuje pozici někam na konec, ale určitě ne přesně, protože, když zkopíruju ten log a dám ho ještě jednou za původní tak to nepřečte vůbec první 4 kočky u toho vložení a je tam problém s tím, že když dám, aby to ukazovalo pozici po každým přečteným řádku,tak opět první řádek má už hodnotu 1024 a 8x za sebou, a pořád to jde po 1024, potom 2048 apod... :(

Někde jsem četl, že se to nemá vůbec používat , pokud nechci ztratit data... seek a position :(

 
Nahoru Odpovědět
14.7.2016 18:48
Avatar
Dog
Člen
Avatar
Dog:14.7.2016 19:13

Vyřešil jsem to tak, že jsem se vykašlal na pozice a vždycky vymazal celej log po tom cyklu :-)

 
Nahoru Odpovědět
14.7.2016 19:13
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 21 zpráv z 21.