Diskuze: Pomoc prosim
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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
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
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.
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<String, 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.
asi jsem sem hodil jeste maly sampl. Sample 7 kusu
{
"Nazev": "Hlavní objekt",
"Ulice": "Diskařská",
"Mesto": "Praha",
"PSC": "160 17",
"Web": "",
"OrgJednotkyPkOrgJednotkaID": "13ab9f1b-a74b-4e24-a46f-f60bdbb06c3e",
"OrgJednotkyFkOrgJednotkaID": "00000000-0000-0000-0000-000000000000"
},
{
"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"
},
{
"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"
},
{
"Nazev": "Hl. město Praha",
"Ulice": "KOZÍ 915/7",
"Mesto": "PRAHA 1",
"PSC": "110 00",
"Web": "www.praha.cz",
"OrgJednotkyPkOrgJednotkaID": "e79ff092-fe10-40ae-b4d3-eca02cd73945",
"OrgJednotkyFkOrgJednotkaID": "ac994e99-8e43-4a78-86b8-8a7b0305e10e"
},
{
"Nazev": "Středočeský kraj",
"Ulice": "Zátopkova",
"Mesto": "Praha",
"PSC": "16017",
"Web": "skfs.cz",
"OrgJednotkyPkOrgJednotkaID": "0acd174d-b99a-42c4-a52f-6e82ac5077e9",
"OrgJednotkyFkOrgJednotkaID": "ac994e99-8e43-4a78-86b8-8a7b0305e10e"
},
{
"Nazev": "Benešov",
"Ulice": "Vnoučkova 1699",
"Mesto": "Benešov",
"PSC": "25601",
"Web": "www.ofsbenesov.cz",
"OrgJednotkyPkOrgJednotkaID": "26f24151-bd42-4492-9b43-146e8966f682",
"OrgJednotkyFkOrgJednotkaID": "0acd174d-b99a-42c4-a52f-6e82ac5077e9"
},
{
"Nazev": "Beroun",
"Ulice": "Okružní 650",
"Mesto": "Beroun",
"PSC": "26601",
"Web": "www.ofsberoun.cz",
"OrgJednotkyPkOrgJednotkaID": "a30f40ba-bd7a-49d5-a9c8-6259b7dd76d7",
"OrgJednotkyFkOrgJednotkaID": "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
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
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.
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.
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;
}
}
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(@"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
}
}
}
Mnohokrat děkuji.
M.
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
}
}
}
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)
+20 Zkušeností
+2,50 Kč
Zobrazeno 14 zpráv z 14.