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í.
Avatar
Martin
Člen
Avatar
Martin:10.11.2017 12:50

Ahoj. Mam takovej problem.
Mam zadanej textak kde je hromada objektu. Kazdy objekt se sklada ze 7 stringu. Viz :
{
"Nazev": "Hlavní objekt",
"Ulice": "Diskařská",
"Mesto": "Praha",
"PSC": "160 17",
"Web": "",
"OrgJednotkyP­kOrgJednotkaID": "13ab9f1b-a74b-4e24-a46f-f60bdbb06c3e",
"OrgJednotkyF­kOrgJednotkaID": "00000000-0000-0000-0000-000000000000"
},
{
"Nazev": "Řídící komise pro Čechy",
"Ulice": "Diskařská 2431/1",
"Mesto": "Praha ",
"PSC": "16017",
"Web": "",
"OrgJednotkyP­kOrgJednotkaID": "ac994e99-8e43-4a78-86b8-8a7b0305e10e",
"OrgJednotkyF­kOrgJednotkaID": "13ab9f1b-a74b-4e24-a46f-f60bdbb06c3e"
},
{
"Nazev": "Řídící komise pro Moravu",
"Ulice": "Na Střelnici 39",
"Mesto": "Olomouc",
"PSC": "77900",
"Web": "",
"OrgJednotkyP­kOrgJednotkaID": "6dc6baa0-4477-4cf5-bb48-8e80f24289d7",
"OrgJednotkyF­kOrgJednotkaID": "13ab9f1b-a74b-4e24-a46f-f60bdbb06c3e"
},
a ja bych to potreboval dat do c# objektu, nevim jaky je vhodny pouzit a dale je to flat struktura ale mam z toho udelat tree strukturu kdy OrgJednotkyFkOr­gJednotkaID tedy FK je odkaz na rodice a OrgJednotkyPkOr­gJednotkaID tedy PK pro zkraceni je odkaz na podrizeneho.
Nechci aby jste za me nekdo delal moje vlastni vymysli, co si testuju, jen me nasmerovat.
Kazdy objekt si nejdriv predelam do jednotlivych stringu a pak prave nevim co pouzit a jak to ulozit abych s tim mohl pracovat dal.
A udelat vysledny Tree.
Vim, ze prvni objekt je root stromu.
Pokud je neco nejasneho vse dovysvetlim.
Dekuji
Martin

 
Odpovědět
10.11.2017 12:50
Avatar
Odpovídá na Martin
Erik Šťastný:10.11.2017 13:00

Ze zadání jsem bohužel moc nepochopil jak má vypadat výstup,

nicméně práce se souborem může být snadná, vypadá to, že můžeš celý soubor splitnout čárkou a pak to parsovat přímo do objektů jako deserializaci JSONu :)

 
Nahoru Odpovědět
10.11.2017 13:00
Avatar
Martin
Člen
Avatar
Martin:10.11.2017 13:02

vystup je v podstate volitelny, me staci to vypsat do prikazovy radky. Jen aby to bylo ve forme stromu. Nejsem si jistej jestli se uplne dobre vyjadruju. Tzn treba root je bez odsazeni, podrizenej je s jednim odsazenim od kraje (treba dve mezey a pod) a aby to bylo srovnany za sebou jak by mely patrit

Editováno 10.11.2017 13:03
 
Nahoru Odpovědět
10.11.2017 13:02
Avatar
Odpovídá na Martin
Erik Šťastný:10.11.2017 13:11

Bohužel pořád nechápu co myslíš tím "forma stromu"...

Uveď radši konkrétní příklad jak by pro data co jsi uvedl měl vypadat výstup.

Editováno 10.11.2017 13:11
 
Nahoru Odpovědět
10.11.2017 13:11
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Martin
Martin Dráb:10.11.2017 13:23

Ten vstup zdá se býti téměř ve formátu JSON (a na ty hranaté závorky značící, že se jedná o pole). Pro reprezentaci každého objektu klidně vytvoř třídu, která v jednotlivých atributech bude uchovávat ty řetězce. Její potomky můžeš uchovávat v atributu typu slovník (Dictionary<Strin­g, TvojeTrida>). Pro vypsání stromové struktury ani uchoávat rodiče nepotřebuješ (pokud je tato relace opačná s relací potomka).

Pak ti stačí implementovat v tříde TvojeTrida metodu ToJSON, která jednotlivé řetězce přemění do formátu toho vstupu a zavolá metodu ToJSON pro objekty v tom slovníku.

Podívej se, třeba na Wikipedii, jak JSON vypadá, a pokud si budeš myslet, že je to dobrý formát pro tvoje účely, tak jej použij.

Nahoru Odpovědět
10.11.2017 13:23
2 + 2 = 5 for extremely large values of 2
Avatar
Martin
Člen
Avatar
Martin:10.11.2017 13:24

asi jsem sem hodil jeste maly sampl. Sample 7 kusu

{
"Nazev": "Hlavní objekt",
"Ulice": "Diskařská",
"Mesto": "Praha",
"PSC": "160 17",
"Web": "",
"OrgJednotkyP­kOrgJednotkaID": "13ab9f1b-a74b-4e24-a46f-f60bdbb06c3e",
"OrgJednotkyF­kOrgJednotkaID": "00000000-0000-0000-0000-000000000000"
},
{
"Nazev": "Řídící komise pro Čechy",
"Ulice": "Diskařská 2431/1",
"Mesto": "Praha ",
"PSC": "16017",
"Web": "",
"OrgJednotkyP­kOrgJednotkaID": "ac994e99-8e43-4a78-86b8-8a7b0305e10e",
"OrgJednotkyF­kOrgJednotkaID": "13ab9f1b-a74b-4e24-a46f-f60bdbb06c3e"
},
{
"Nazev": "Řídící komise pro Moravu",
"Ulice": "Na Střelnici 39",
"Mesto": "Olomouc",
"PSC": "77900",
"Web": "",
"OrgJednotkyP­kOrgJednotkaID": "6dc6baa0-4477-4cf5-bb48-8e80f24289d7",
"OrgJednotkyF­kOrgJednotkaID": "13ab9f1b-a74b-4e24-a46f-f60bdbb06c3e"
},
{
"Nazev": "Hl. město Praha",
"Ulice": "KOZÍ 915/7",
"Mesto": "PRAHA 1",
"PSC": "110 00",
"Web": "www.praha.cz",
"OrgJednotkyP­kOrgJednotkaID": "e79ff092-fe10-40ae-b4d3-eca02cd73945",
"OrgJednotkyF­kOrgJednotkaID": "ac994e99-8e43-4a78-86b8-8a7b0305e10e"
},
{
"Nazev": "Středočeský kraj",
"Ulice": "Zátopkova",
"Mesto": "Praha",
"PSC": "16017",
"Web": "skfs.cz",
"OrgJednotkyP­kOrgJednotkaID": "0acd174d-b99a-42c4-a52f-6e82ac5077e9",
"OrgJednotkyF­kOrgJednotkaID": "ac994e99-8e43-4a78-86b8-8a7b0305e10e"
},
{
"Nazev": "Benešov",
"Ulice": "Vnoučkova 1699",
"Mesto": "Benešov",
"PSC": "25601",
"Web": "www.ofsbenesov­.cz",
"OrgJednotkyP­kOrgJednotkaID": "26f24151-bd42-4492-9b43-146e8966f682",
"OrgJednotkyF­kOrgJednotkaID": "0acd174d-b99a-42c4-a52f-6e82ac5077e9"
},
{
"Nazev": "Beroun",
"Ulice": "Okružní 650",
"Mesto": "Beroun",
"PSC": "26601",
"Web": "www.ofsberoun.cz",
"OrgJednotkyP­kOrgJednotkaID": "a30f40ba-bd7a-49d5-a9c8-6259b7dd76d7",
"OrgJednotkyF­kOrgJednotkaID": "0acd174d-b99a-42c4-a52f-6e82ac5077e9"
}
}

a o co ja se snazim (asi se to nejlepe da pospsat jako adresarova struktura ve win)

root :
Hlavní objekt /*obsahuje deti*/
--Řídící komise pro Čechy
----Hl. město Praha
----Středočeský kraj
------Benešov
------Beroun
--Řídící komise pro Moravu

Snad jsem se do toho nezamotal jeste vice.
Zdrojovz soubor obsahuje vsechnz pobocky daneho uradu v CR

Editováno 10.11.2017 13:25
 
Nahoru Odpovědět
10.11.2017 13:24
Avatar
Martin
Člen
Avatar
Odpovídá na Martin Dráb
Martin:10.11.2017 13:31

mrkal jsem jak vypada json a snazil jsem se na to naroubovat napr newtonssoft.json ale vsechny podobne nugety mi nahlasily chybu ze to neni json.
A jeste jsem nasel vlozit specialni do tridy v zalozce tools ve vs a vysledek je takovyto :
viz obrazek

 
Nahoru Odpovědět
10.11.2017 13:31
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Martin
Martin Dráb:10.11.2017 14:31

Jestli se dívám dobře, tak pokud bys na začátek tohoto vstupu přidal

[

a na jeho konec

]

měl by to pak být validní JSON.

Nahoru Odpovědět
10.11.2017 14:31
2 + 2 = 5 for extremely large values of 2
Avatar
Anton Arnautov:10.11.2017 14:41

Takhle... prichazim sem sice z prostredi Pythonu, ale princip by mel by stejny.
Tohle vypada na nejaky select z DB, kde se proste nic nefiltrovalo... nekdo ti proste vyplivnul vystup z DB do JSONu typu:

select * from [table_name]
--mozna nejaky filtr tady

Takze... jak s tim nalozit? Nejlepsi by asi bylo, kdybys mel pristup k te DB, ale vzhledem k tomu, ze jsi nic takoveho nezminil, tak budeme vychazet jen z toho textaku.

Nejprve bych si asi splitnul celou tu hromadu objektu podle carky:

string_objects = loaded_string.split(",")

To by ti melo vratit pole tech objektu, ktere jsou ale porad jen typu string.

Co dal? Nejlepsi (pro stromovou strukturu) by bylo pouzit Dictionary, ktery funguje v podstate skoro stejne jako JSON, ale je proste pro dany jazyk pouzitelnejsi. Trosku jsem googloval a nasel jsem tohle.
Projedes si to pole tedy cyklem, a vsechny prevedes do dictu:

import json
dict_objects = []
for o in string_objects:
        try:
                dict_objects.append(json.loads(o))
        except:
                print str(o)+' could not be parsed'
                continue

Ted... by asi bylo potreba si vytahnout vsechny parenty (v tomto pripade predpokladame, ze vsechny parenty maji FK = "00000000-0000-0000-0000-000000000000"):

parents = list(filter(lambda key: key["OrgJednotkyFkOrgJednotkaID"] == "00000000-0000-0000-0000-000000000000", dict_list))

Ted bych si napsal nejakou rekurzivni funkci, ktera mi bude projizdet originalni pole dictu a bude to vnorovat:

def repeat(data, level):
        for o in data:
                filtered_children = list(filter(lambda key: key["OrgJednotkyFkOrgJednotkaID"] == o[''OrgJednotkyPkOrgJednotkaID"], dict_list))
                if not len(filtered_children):
                        return False

                o["children"] = filtered_children
                o["level"] = level+1
                repeat(filtered_children, level+1)

No a potom to das jenom do toho sveho normalniho kodu a spustis. Vysledkem by melo byt neco takoveho:

[
        {
                "Nazev": "Hlavní objekt",
                "Ulice": "Diskařská",
                "Mesto": "Praha",
                "PSC": "160 17",
                "Web": "",
                "OrgJednotkyPkOrgJednotkaID": "13ab9f1b-a74b-4e24-a46f-f60bdbb06c3e",
                "OrgJednotkyFkOrgJednotkaID": "00000000-0000-0000-0000-000000000000",
                "level": 0,
                "children":[
                        {
                                "Nazev": "Řídící komise pro Čechy",
                                "Ulice": "Diskařská 2431/1",
                                "Mesto": "Praha ",
                                "PSC": "16017",
                                "Web": "",
                                "OrgJednotkyPkOrgJednotkaID": "ac994e99-8e43-4a78-86b8-8a7b0305e10e",
                                "OrgJednotkyFkOrgJednotkaID": "13ab9f1b-a74b-4e24-a46f-f60bdbb06c3e",
                                "level": 1,
                                "children": [...]
                        },
                        {
                                "Nazev": "Řídící komise pro Moravu",
                                "Ulice": "Na Střelnici 39",
                                "Mesto": "Olomouc",
                                "PSC": "77900",
                                "Web": "",
                                "OrgJednotkyPkOrgJednotkaID": "6dc6baa0-4477-4cf5-bb48-8e80f24289d7",
                                "OrgJednotkyFkOrgJednotkaID": "13ab9f1b-a74b-4e24-a46f-f60bdbb06c3e",
                                "level": 1,
                                "children": [...]
                        }
                ]
        }
]

Snad jsem pomohl alespon trosku. :)

Editováno 10.11.2017 14:43
Nahoru Odpovědět
10.11.2017 14:41
Don't be a salad, be the best god damn brocolli you could ever be!
Avatar
Ondřej Štorc
Tvůrce
Avatar
Ondřej Štorc:10.11.2017 17:25

Přepsal jsem akorát řešení Anton Arnautov do C#:

public class Rootobject
    {
        public Rootobject()
        {
            Childern = new List<Rootobject>();
        }

        public string Nazev { get; set; }
        public string Ulice { get; set; }
        public string Mesto { get; set; }
        public string PSC { get; set; }
        public string Web { get; set; }
        public string OrgJednotkyPkOrgJednotkaID { get; set; }
        public string OrgJednotkyFkOrgJednotkaID { get; set; }
        public List<Rootobject> Childern { get; set; }
        public Rootobject Parent { get; set; }
    }


    public class Parser
    {
        public const string EmptyId = "00000000-0000-0000-0000-000000000000";

        public static List<Rootobject> Parse(List<Rootobject> data, string parentId = EmptyId)
        {
            var res = data.Where(x => x.OrgJednotkyFkOrgJednotkaID == parentId).ToList();

            foreach (var item in res)
            {
                foreach (var child in data.Where(x => x.OrgJednotkyFkOrgJednotkaID == item.OrgJednotkyPkOrgJednotkaID))
                {
                    item.Childern.Add(child);
                    child.Parent = item;
                    child.Childern = Parse(data, child.OrgJednotkyPkOrgJednotkaID);
                }
            }

            return res;
        }
    }
Nahoru Odpovědět
10.11.2017 17:25
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Martin
Člen
Avatar
Martin:11.11.2017 21:01

Ahoj, vsem dekuji. Zitra se na to podivam. Vubec jsem dneska nestihal.

 
Nahoru Odpovědět
11.11.2017 21:01
Avatar
Martin
Člen
Avatar
Martin:12.11.2017 18:05

Ahoj, tak jestli to chapu tak jsem dostal dve tridy, ktery pripojim ke svemu programu.
Mam napsano tak ze naplnim Ulice,Nazev atd. z classy Rootobject.
Ale nejsem si presne jistej jak pouzit parser.
Popravde tomu moc nerozumim. Byl bys tak laskavy a prosim a okomentoval jednotlive prikazy.
Snad nejsem uz moc drzej.

Ja mam udelane toto :
namespace TrideniObjektu
{
class Program
{
static void Main(string[] args)
{
int pocet = 0;
Rootobject trideni = new Rootobject(); //trida pro ulozeni temp dat

using (StreamReader sr = new StreamReader(@"sam­ple.json")) //nacte soubor
{
string PuvodniRadek; //radek jak je napsan v zdrojovem json
string UpravenyRadek; //radek upraveny a natrimovany pro switch
while ((PuvodniRadek = sr.ReadLine()) != null ) //cte radku
{
UpavaRadku upavaRadku = new UpavaRadku(); //nacte tridu na upravu radku pro witch
UpravenyRadek = upavaRadku.Trim­Radku(Puvodni­Radek);

switch (UpravenyRadek)
{
case "1":
pocet++; //zacne novy obejkt *****************;
break;
case "2":
pocet++; //ukonci objek ***************
break;
case "Nazev":
trideni.Nazev = PuvodniRadek; //ulozi nazev do RootObject.cs
break;
case "Ulice":
trideni.Ulice = PuvodniRadek; //ulozi ulici do RootObject.cs
break;
case "Mesto":
trideni.Mesto = PuvodniRadek; // ulozi Mesto do RootObject.cs
break;
case "PSC":
trideni.PSC = PuvodniRadek; // ulozi PSC do RootObject.cs
break;
case "Web":
trideni.Web = PuvodniRadek; // ulozi ** do RootObject.cs
break;
case "OrgJednotkyP­kOrgJednotkaID":
trideni.OrgJed­notkyPkOrgJed­notkaID = PuvodniRadek; // ulozi ** do RootObject.cs
break;
case "OrgJednotkyF­kOrgJednotkaID":
trideni.OrgJed­notkyFkOrgJed­notkaID = PuvodniRadek; // ulozi ** do RootObject.cs
break;

}

Console.Write­Line(PuvodniRa­dek);

}

Console.Write­Line("Pro ukonceni klavesu");
Console.ReadKey();
}
}
}
}

class UpavaRadku
{
public string result;

/// <summary>
/// Vrati retezec po trimovani, odstrani mezery, uvozovky
/// </summary>
/// <param name="TrimMe"></pa­ram>
/// <returns>string Nazev,Ulice,Mes­to,PSC,Web,Pk,Pf</re­turns>
public string TrimRadku(string TrimMe)
{
if (TrimMe == "{") //pokud *.json zacina vrac zatim 1
{
return result = "1";
}
else if (TrimMe == "{,") //ukoncuje jeden objekt z *.json
{
return result = "2";
}
else
{
result = Regex.Match(TrimMe, "^[^ ]+").Value; //odstrani vse ze prvni mezerou
this.result = result.Replace("\"", string.Empty); //odstrani vsechny \
this.result = result.Replace(":", string.Empty); //odtsrani vsechnz :
return result; //vrati natrimovanou hodnotu
}
}
}

Mnohokrat děkuji.
M.

Editováno 12.11.2017 18:06
 
Nahoru Odpovědět
12.11.2017 18:05
Avatar
Martin
Člen
Avatar
Martin:12.11.2017 18:10

Jeste jednou zapomel jsem to vlozik jako kod a pak uz to neslo upravit.

namespace TrideniObjektu
{
    class Program
    {
        static void Main(string[] args)
        {
            int pocet = 0;
            Rootobject trideni = new Rootobject(); //trida pro ulozeni temp dat

            using (StreamReader sr = new StreamReader(@"sample.json")) //nacte soubor
            {
                string PuvodniRadek; //radek jak je napsan v zdrojovem json
                string UpravenyRadek; //radek upraveny a natrimovany pro switch
                while ((PuvodniRadek = sr.ReadLine()) != null )  //cte radku
                {
                    UpavaRadku upavaRadku = new UpavaRadku(); //nacte tridu na upravu radku pro witch
                    UpravenyRadek = upavaRadku.TrimRadku(PuvodniRadek);

                    switch (UpravenyRadek)
                    {
                        case "1":
                            pocet++; //zacne novy obejkt *****************;
                            break;
                        case "2":
                            pocet++; //ukonci objek ***************
                            break;
                        case "Nazev":
                            trideni.Nazev = PuvodniRadek; //ulozi nazev do RootObject.cs
                            break;
                        case "Ulice":
                            trideni.Ulice = PuvodniRadek; //ulozi ulici do RootObject.cs
                            break;
                        case "Mesto":
                            trideni.Mesto = PuvodniRadek; // ulozi Mesto do RootObject.cs
                            break;
                        case "PSC":
                            trideni.PSC = PuvodniRadek; // ulozi PSC do RootObject.cs
                            break;
                        case "Web":
                            trideni.Web = PuvodniRadek; // ulozi ** do RootObject.cs
                            break;
                        case "OrgJednotkyPkOrgJednotkaID":
                            trideni.OrgJednotkyPkOrgJednotkaID = PuvodniRadek; // ulozi ** do RootObject.cs
                            break;
                        case "OrgJednotkyFkOrgJednotkaID":
                            trideni.OrgJednotkyFkOrgJednotkaID = PuvodniRadek; // ulozi ** do RootObject.cs
                            break;

                    }


                    Console.WriteLine(PuvodniRadek);

                }

                Console.WriteLine("Pro ukonceni klavesu");
                Console.ReadKey();
            }
        }
    }
}
class UpavaRadku
{
    public string result;

    /// <summary>
    /// Vrati retezec po trimovani, odstrani mezery, uvozovky
    /// </summary>
    /// <param name="TrimMe"></param>
    /// <returns>string Nazev,Ulice,Mesto,PSC,Web,Pk,Pf</returns>
    public string TrimRadku(string TrimMe)
    {
        if (TrimMe == "{")  //pokud *.json zacina vrac zatim 1
        {
            return result = "1";
        }
        else if (TrimMe == "{,") //ukoncuje jeden objekt z *.json
        {
            return result = "2";
        }
        else
        {
            result = Regex.Match(TrimMe, "^[^ ]+").Value; //odstrani vse ze prvni mezerou
            this.result = result.Replace("\"", string.Empty); //odstrani vsechny \
            this.result = result.Replace(":", string.Empty); //odtsrani vsechnz :
            return result; //vrati natrimovanou hodnotu
        }
    }
}
Editováno 12.11.2017 18:12
 
Nahoru Odpovědět
12.11.2017 18:10
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Martin
Ondřej Štorc:12.11.2017 18:24

Proč prostě nepoužiješ ten Newtonsoft a neuděláš z toho ten objekt rovnou?

public static List<Rootobject> GetData(string path)
       {
           string data = System.IO.File.ReadAllText(path);
           return JsonConvert.DeserializeObject<Rootobject[]>(data).ToList();
       }

A poznámka na konec, pojmenuj ten výsledný objekt nějak jinak než Rootobject, já ho mám tak pojmenovaný, jelikož mi ho tak pojmenovalo IDE a byl jsem línej to měnit...

P.S:
Výsledný požití by vypadalo asi takto:

var res = Parser.Parse(DataParser.GetData("data.json"));

(je to statický opět jen kvůli mé lenosti)

Editováno 12.11.2017 18:26
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
12.11.2017 18:24
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
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 14 zpráv z 14.