Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // Analýza volebních výsledků funkční pro rok 2006
- //
- using System.IO; //file operations
- using HtmlAgilityPack; //header variable consideration
- using System.Windows.Forms; //operace s richtextboxem
- using System.Collections;
- using System;
- using System.ComponentModel;
- using System.Threading; //operace s arraylistem
- namespace EPOS_LS
- {
- class fahrs
- {
- //načte složku pro zpracování a rozhodne co s jednotlivými soubory
- public static void recognize(string dirpath, form1 form)
- {
- DirectoryInfo dir = new DirectoryInfo(dirpath);
- FileInfo[] fi = dir.GetFiles("*.html");
- foreach (FileInfo file in fi)
- {
- //složka načtena, budeme zjišťovat co je obsah podle nadpisu h2
- HtmlAgilityPack.HtmlDocument dokument = new HtmlAgilityPack.HtmlDocument();
- dokument.Load(file.FullName, System.Text.Encoding.GetEncoding(28592)); //načte dokument se správným kódováním (volby.cz compatible)
- if (dokument.DocumentNode != null)
- {
- HtmlNode h2 = dokument.DocumentNode.SelectSingleNode("//h2");
- if (h2 != null) //tahle podmínka zařizuje rozřazení podle obsahu H2
- {
- if (h2.InnerText.ToString().Contains("Číselník obcí a okrsků") == true) //Je tam nějaká divná mezera, proto contains a nestačí ==
- {
- //baselist.Tfilllevel3(file.FullName, form); //určeno pro číselníky 3. úrovně
- //zakomentováno - tato úroveň číselníku je v databázi a není potřeba ji přidávat
- }
- if (h2.InnerText.ToString().Contains("") == true) //-//-
- {
- }
- }
- }
- else
- {
- //H2 error...
- logsys.WriteLogEntry(file.Name + "neobsahuje H2 (!!!)", form);
- }
- }
- }
- //snalyzuje soubory ve složce na hlavním vlákně
- public static void AnalyzeFolder(string dirpath, string xpath, form1 form, RichTextBox richTextBox)
- {
- //vygenerování polí pro výsledek a počet výsledků
- ArrayList vysledky = new ArrayList();
- ArrayList pocty = new ArrayList();
- pocty.Add(0);
- vysledky.Add("Dokument neobsahuje nic podle zadaných kritérií (XPATH)");
- DirectoryInfo dir = new DirectoryInfo(dirpath);
- FileInfo[] fi = dir.GetFiles("*.html");
- foreach (FileInfo file in fi)
- {
- //složka načtena, budeme zjišťovat co je obsah podle nadpisu h2
- HtmlAgilityPack.HtmlDocument dokument = new HtmlAgilityPack.HtmlDocument();
- dokument.Load(file.FullName, System.Text.Encoding.GetEncoding(28592)); //načte dokument se správným kódováním (volby.cz compatible)
- if (dokument.DocumentNode != null)
- {
- HtmlNode node = dokument.DocumentNode.SelectSingleNode(xpath);
- try
- {
- string vysledek = node.InnerHtml.ToString();
- int i = 0;
- bool nalezeno = false;
- foreach (string zaznam in vysledky)
- {
- if (zaznam.Contains(vysledek)) { nalezeno = true; break; } //prochází záznamy dokud nenajde shodu - pokud ji najde změní proměnnou nalezeno a přeruší cyklus
- else
- {
- i++;
- }
- }
- if (!nalezeno)
- {
- vysledky.Add(vysledek); //přidá nový výsledek do pole
- pocty.Add(1);
- }
- else if (nalezeno) { pocty[i] = 1 + Convert.ToInt32(pocty[i].ToString()); i++; } //inkrementuje počet nalezených výsledků
- //else
- //{
- // pocty[0] = 1 + Convert.ToInt32(pocty[0].ToString());
- //}
- }
- catch (NullReferenceException)
- {
- pocty[0] = 1 + Convert.ToInt32(pocty[0].ToString()); //pokud není H2
- }
- }
- for (int z = 0; z < vysledky.Count; z++)
- {
- richTextBox.AppendText(vysledky[z] + " -nalezeno: " + pocty[z] + "*\r\n");
- }
- }
- }
- //analyzuje soubory ve složce na pracovním vlákně (nesekne aplikaci)
- //vypíše kritéria xpath a jejich počet rychlost 30-40 fps
- static BackgroundWorker bw = new BackgroundWorker();
- public static void AnalyzeFolderBackground(object data)
- {
- analyzepattern workdata = data as analyzepattern;
- bw.DoWork += new DoWorkEventHandler(bw_DoWork);
- bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
- bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
- bw.WorkerReportsProgress = true;
- bw.WorkerSupportsCancellation = true;
- bw.RunWorkerAsync(data);
- }
- static void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
- {
- var form = Form.ActiveForm as form1;
- if (form != null)
- {
- form.progress = e.ProgressPercentage;
- }
- }
- static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
- {
- if (e.Cancelled)
- { return; }
- if (e.Error != null) { return; }
- else
- {
- workdata outputdata = e.Result as workdata;
- var form = Form.ActiveForm as form1;
- if (form != null)
- {
- for (int z = 0; z < outputdata.vysledky.Count; z++)
- {
- form.casanalyzy.Enabled = false;
- form.richTextBox1.AppendText(outputdata.vysledky[z] + " -nalezeno: " + outputdata.pocty[z] + "*\r\n");
- }
- }
- }
- }
- static void bw_DoWork(object sender, DoWorkEventArgs e)
- {
- //přimeme argumenty
- analyzepattern inputdata = e.Argument as analyzepattern;
- ArrayList pocty = new ArrayList();
- ArrayList vysledky = new ArrayList();
- //a tady je práce...
- //vygenerování polí pro výsledek a počet výsledků
- pocty.Add(0);
- vysledky.Add("Dokument neobsahuje nic podle zadaných kritérií (XPATH)");
- DirectoryInfo dir = new DirectoryInfo(inputdata.folderpath);
- FileInfo[] fi = dir.GetFiles("*.html");
- Int32 p = 0;
- foreach (FileInfo file in fi)
- {
- //ověříme jestli nemáme přestat
- if (bw.CancellationPending)
- {
- e.Cancel = true;
- return; //proč je tu tohle?
- }
- //složka načtena, budeme zjišťovat co je obsah podle nadpisu h2
- HtmlAgilityPack.HtmlDocument dokument = new HtmlAgilityPack.HtmlDocument();
- dokument.Load(file.FullName, System.Text.Encoding.GetEncoding(28592)); //načte dokument se správným kódováním (volby.cz compatible)
- if (dokument.DocumentNode != null)
- {
- HtmlNode node = dokument.DocumentNode.SelectSingleNode(inputdata.xpath);
- try
- {
- string vysledek = node.InnerHtml.ToString();
- int i = 0;
- bool nalezeno = false;
- foreach (string zaznam in vysledky)
- {
- if (zaznam.Contains(vysledek)) { nalezeno = true; break; } //prochází záznamy dokud nenajde shodu - pokud ji najde změní proměnnou nalezeno a přeruší cyklus
- else
- {
- i++;
- }
- }
- if (!nalezeno)
- {
- vysledky.Add(vysledek); //přidá nový výsledek do pole
- pocty.Add(1);
- }
- else if (nalezeno) { pocty[i] = 1 + Convert.ToInt32(pocty[i].ToString()); i++; p++; } //inkrementuje počet nalezených výsledků
- else
- {
- pocty[0] = 1 + Convert.ToInt32(pocty[0].ToString());
- p++;
- }
- }
- catch (NullReferenceException)
- {
- pocty[0] = 1 + Convert.ToInt32(pocty[0].ToString()); //pokud není H2
- }
- }
- else
- {
- pocty[0] = 1 + Convert.ToInt32(pocty[0].ToString()); //pokud není dokument?
- }
- bw.ReportProgress(p);
- }
- //odešleme výsledek metodě runworkercompleted
- workdata outputdata = new workdata();
- outputdata.vysledky = vysledky;
- outputdata.pocty = pocty;
- e.Result = outputdata;
- }
- public static void cancelbw()
- {
- if (bw.WorkerSupportsCancellation)
- {
- bw.CancelAsync();
- }
- }
- //
- //analýza jednotlivých volebních ročníků
- //
- //
- //1996 - 2002
- //
- static BackgroundWorker bw2002 = new BackgroundWorker();
- public static void Analyze2002(object data)
- {
- bw2002.DoWork += new DoWorkEventHandler(bw2002_DoWork);
- bw2002.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw2002_RunWorkerCompleted);
- bw2002.ProgressChanged += new ProgressChangedEventHandler(bw2002_ProgressChanged);
- bw2002.WorkerReportsProgress = true;
- bw2002.WorkerSupportsCancellation = true;
- bw2002.RunWorkerAsync(data);
- }
- static void bw2002_ProgressChanged(object sender, ProgressChangedEventArgs e)
- {
- var form = Form.ActiveForm as form1;
- if (form != null)
- {
- form.progress = e.ProgressPercentage;
- }
- }
- static void bw2002_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
- {
- if (e.Cancelled)
- { return; }
- if (e.Error != null) { return; }
- else
- {
- workdata outputdata = e.Result as workdata;
- var form = Form.ActiveForm as form1;
- if (form != null)
- {
- form.casanalyzy.Enabled = false;
- return;
- }
- }
- }
- static void bw2002_DoWork(object sender, DoWorkEventArgs e)
- {
- //zpracujeme argumenty
- analyzepattern inputdata = e.Argument as analyzepattern;
- logsys.WriteLogEntry("Pracovní vlákno aktivní! BW2002 pracuje...", inputdata.form);
- DirectoryInfo dir = new DirectoryInfo(inputdata.folderpath);
- FileInfo[] fi = dir.GetFiles("*.html"); //!!!HTML NEBO HTM
- Int32 p = 0; //počet zpracovaných souborů
- foreach (FileInfo file in fi)
- {
- //ověříme jestli nemáme přestat
- if (bw2002.CancellationPending)
- {
- e.Cancel = true;
- return; //proč je tu tohle?
- }
- //složka načtena, budeme zjišťovat co je obsah podle nadpisu h2
- HtmlAgilityPack.HtmlDocument dokument = new HtmlAgilityPack.HtmlDocument();
- dokument.Load(file.FullName, System.Text.Encoding.GetEncoding(28592)); //načte dokument se správným kódováním (volby.cz compatible)
- if (dokument.DocumentNode != null)
- {
- //ověříme jestli se jedná o stránku SPRÁVNÉHO výsledku
- HtmlNodeCollection bnodes = dokument.DocumentNode.SelectNodes("//b"); //vytáhne <B>čka (musí být 3)
- HtmlNode bnode = dokument.DocumentNode.SelectSingleNode("//b[1]"); //vytáhne první... další kontrola dokumentu
- HtmlNode node = dokument.DocumentNode.SelectSingleNode("//font[@size='+0']"); //vytáhne "nadpis"
- if (bnodes != null & node != null)
- {
- if (bnodes.Count == 3 & node.InnerText.Contains("Výsledky hlasování za územní celky") & !bnode.InnerText.Contains("Výběr obce")) //contains proto, že to innertextu se vcucne i zalamovací znak (ne br, znak) a == nefunguje
- //ten string je česky, není potřeba filtrovat ještě podle kódování (ověřit, že aj verze neobsahuje český string!)
- {//dobře, pokud jsme tady je to dobrá stránka teď potřebujeme ID obce
- HtmlNode citynamenode = dokument.DocumentNode.SelectSingleNode("//b[3]"); //vytáhne "nadpis" -11 prvních znaků
- string cityname = citynamenode.InnerText.ToString();
- if (cityname.Contains("Přebírací místo:"))
- {
- continue;
- }
- cityname = cityname.Replace(" ", " ");
- cityname = cityname.Remove(0, 6);
- int cityid = dbo.getcityid(cityname);
- if (cityid == -1) //v roce 1996,1998 je potřeba ješte odstranit číslo obce
- {
- try
- {
- cityname = cityname.Remove(0, 7);
- cityid = dbo.getcityid(cityname);
- }
- catch (Exception)
- {
- logsys.WriteLogEntry("ERROR0: Obec není v databázi! obec: " + cityname + " soubor: " + file.FullName, inputdata.form);
- continue; //můžeme soubor rovnou přeskočit
- }
- }
- //zjistíme nevoliče
- HtmlNode voliciinput = dokument.DocumentNode.SelectSingleNode("//table[1]/tr/td[4]");
- HtmlNode platnehlasyinput = dokument.DocumentNode.SelectSingleNode("//table[1]/tr/td[8]");
- if (voliciinput == null | platnehlasyinput == null)
- {
- logsys.WriteLogEntry("ERROR1: nepodařilo se vytvořit záznam (problém s cityname:"+cityname+") + soubor: " + file.FullName, inputdata.form);
- continue;
- }
- string volici = voliciinput.InnerText.ToString();
- string platnehlasy = platnehlasyinput.InnerText.ToString();
- volici = volici.Replace(" ", string.Empty);
- volici = volici.Replace(" ", string.Empty);
- platnehlasy = platnehlasy.Replace(" ", string.Empty);
- platnehlasy = platnehlasy.Replace(" ", string.Empty);
- int pocetnevolicu = ((Convert.ToInt32(volici)) - (Convert.ToInt32(platnehlasy)));
- if (cityid != -1)
- {
- // dbo.zapisvysledek(inputdata.year, cityid, -1, pocetnevolicu); //-1 se interpretuje jako null
- }
- else
- {
- logsys.WriteLogEntry("ERROR2: nepodařilo se vytvořit záznam (nevoliči) - cityname: " + cityname + " počet nevoličů: " + pocetnevolicu + " soubor: "+file.FullName, inputdata.form);
- }
- @@ //zjistíme jednotlivé výsledky
- HtmlNodeCollection tabulkavysledku = dokument.DocumentNode.SelectNodes("//table[2]/tr/td[1]"); //první polovina tabluky
- if (tabulkavysledku == null)
- {
- logsys.WriteLogEntry("ERROR3: nepodařilo se vytvořit záznam - chybá tabulka výsledků + soubor: " + file.FullName, inputdata.form);
- continue;
- }
- else
- {
- foreach (var vysledek in tabulkavysledku)
- {
- int v1sid = -1;
- int v1v = -1;
- foreach (HtmlNode row in vysledek.SelectNodes("//tr"))
- {
- try
- {
- int oldsid = v1sid;
- HtmlNode snode = row.SelectSingleNode("td[1]");
- HtmlNode vnode = row.SelectSingleNode("td[3]");
- string sid = snode.InnerText.ToString();
- string votes = vnode.InnerText.ToString();
- sid = sid.Replace(" ", string.Empty);
- sid = sid.Replace(" ", string.Empty);
- votes = votes.Replace(" ", string.Empty);
- votes = votes.Replace(" ", string.Empty);
- try
- {
- v1sid = Convert.ToInt32(sid);
- v1v = Convert.ToInt32(votes);
- if (v1sid == oldsid)
- {
- continue;
- }
- }
- catch (Exception)
- {
- //logsys.WriteLogEntry("vadná řádka" + vysledek.InnerText.ToString(), inputdata.form);
- continue;
- }
- finally
- {
- if (cityid != -1 & v1sid != -1 & v1v != -1)
- {
- dbo.zapisvysledek(inputdata.year, cityid, v1sid, v1v);
- //logsys.WriteLogEntry("Výsledek: obec: " + cityid.ToString() + " Strana: " + v1sid.ToString() + " hlasy: " + v1v.ToString(), inputdata.form);
- }
- else
- {
- logsys.WriteLogEntry("nepodařilo se vytvořit záznam pro: " + cityname, inputdata.form);
- }
- }
- }
- catch (Exception)
- {
- continue;
- }
- }
- }
- }
- }
- }
- else
- {
- p++; //inkrementuje počet zpracovaných soubrů
- bw2002.ReportProgress(p);
- continue;
- }
- }
- else
- {
- p++; //inkrementuje počet zpracovaných soubrů
- bw2002.ReportProgress(p);
- continue;
- }
- p++; //inkrementuje počet zpracovaných soubrů
- bw2002.ReportProgress(p);
- }
- }
- public static void cancelbw2002()
- {
- if (bw2002.WorkerSupportsCancellation)
- {
- bw2002.CancelAsync();
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement