Advertisement
thebys

2006 funkční analýza volebních výsledků

Jun 10th, 2011
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 21.76 KB | None | 0 0
  1. //
  2. // Analýza volebních výsledků funkční pro rok 2006
  3. //
  4. using System.IO; //file operations
  5. using HtmlAgilityPack; //header variable consideration
  6. using System.Windows.Forms; //operace s richtextboxem
  7. using System.Collections;
  8. using System;
  9. using System.ComponentModel;
  10. using System.Threading; //operace s arraylistem
  11.  
  12. namespace EPOS_LS
  13. {
  14.     class fahrs
  15.     {
  16.         //načte složku pro zpracování a rozhodne co s jednotlivými soubory
  17.         public static void recognize(string dirpath, form1 form)
  18.         {
  19.             DirectoryInfo dir = new DirectoryInfo(dirpath);
  20.             FileInfo[] fi = dir.GetFiles("*.html");
  21.             foreach (FileInfo file in fi)
  22.             {
  23.                 //složka načtena, budeme zjišťovat co je obsah podle nadpisu h2
  24.                 HtmlAgilityPack.HtmlDocument dokument = new HtmlAgilityPack.HtmlDocument();
  25.                 dokument.Load(file.FullName, System.Text.Encoding.GetEncoding(28592)); //načte dokument se správným kódováním (volby.cz compatible)
  26.                 if (dokument.DocumentNode != null)
  27.                 {
  28.                     HtmlNode h2 = dokument.DocumentNode.SelectSingleNode("//h2");
  29.                     if (h2 != null) //tahle podmínka zařizuje rozřazení podle obsahu H2
  30.                     {
  31.                         if (h2.InnerText.ToString().Contains("Číselník obcí a okrsků") == true) //Je tam nějaká divná mezera, proto contains a nestačí ==
  32.                         {
  33.                             //baselist.Tfilllevel3(file.FullName, form); //určeno pro číselníky 3. úrovně
  34.                             //zakomentováno - tato úroveň číselníku je v databázi a není potřeba ji přidávat
  35.                         }
  36.                         if (h2.InnerText.ToString().Contains("") == true) //-//-
  37.                         {
  38.  
  39.                         }
  40.                     }
  41.                 }
  42.                 else
  43.                 {
  44.                     //H2 error...
  45.                     logsys.WriteLogEntry(file.Name + "neobsahuje H2 (!!!)", form);
  46.                 }
  47.             }
  48.  
  49.         }
  50.         //snalyzuje soubory ve složce na hlavním vlákně
  51.      
  52.         public static void AnalyzeFolder(string dirpath, string xpath, form1 form, RichTextBox richTextBox)
  53.         {
  54.             //vygenerování polí pro výsledek a počet výsledků
  55.             ArrayList vysledky = new ArrayList();
  56.             ArrayList pocty = new ArrayList();
  57.             pocty.Add(0);
  58.             vysledky.Add("Dokument neobsahuje nic podle zadaných kritérií (XPATH)");
  59.             DirectoryInfo dir = new DirectoryInfo(dirpath);
  60.             FileInfo[] fi = dir.GetFiles("*.html");
  61.             foreach (FileInfo file in fi)
  62.             {
  63.                 //složka načtena, budeme zjišťovat co je obsah podle nadpisu h2
  64.                 HtmlAgilityPack.HtmlDocument dokument = new HtmlAgilityPack.HtmlDocument();
  65.                 dokument.Load(file.FullName, System.Text.Encoding.GetEncoding(28592)); //načte dokument se správným kódováním (volby.cz compatible)
  66.                 if (dokument.DocumentNode != null)
  67.                 {
  68.                     HtmlNode node = dokument.DocumentNode.SelectSingleNode(xpath);
  69.                     try
  70.                     {
  71.                         string vysledek = node.InnerHtml.ToString();
  72.                         int i = 0;
  73.                         bool nalezeno = false;
  74.                         foreach (string zaznam in vysledky)
  75.                         {
  76.                             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
  77.                             else
  78.                             {
  79.                                 i++;
  80.                             }
  81.                         }
  82.                         if (!nalezeno)
  83.                         {
  84.                             vysledky.Add(vysledek); //přidá nový výsledek do pole
  85.                             pocty.Add(1);
  86.                         }
  87.                         else if (nalezeno) { pocty[i] = 1 + Convert.ToInt32(pocty[i].ToString()); i++; } //inkrementuje počet nalezených výsledků
  88.  
  89.                         //else
  90.                         //{
  91.                         //    pocty[0] = 1 + Convert.ToInt32(pocty[0].ToString());
  92.                         //}
  93.                     }
  94.  
  95.  
  96.                     catch (NullReferenceException)
  97.                     {
  98.                         pocty[0] = 1 + Convert.ToInt32(pocty[0].ToString()); //pokud není H2
  99.                     }
  100.  
  101.                 }
  102.                 for (int z = 0; z < vysledky.Count; z++)
  103.                 {
  104.                     richTextBox.AppendText(vysledky[z] + " -nalezeno: " + pocty[z] + "*\r\n");
  105.                 }
  106.  
  107.  
  108.             }
  109.         }
  110.        
  111.         //analyzuje soubory ve složce na pracovním vlákně (nesekne aplikaci)
  112.         //vypíše kritéria xpath a jejich počet rychlost 30-40 fps
  113.         static BackgroundWorker bw = new BackgroundWorker();
  114.         public static void AnalyzeFolderBackground(object data)
  115.         {
  116.             analyzepattern workdata = data as analyzepattern;
  117.             bw.DoWork += new DoWorkEventHandler(bw_DoWork);
  118.             bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
  119.             bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
  120.             bw.WorkerReportsProgress = true;
  121.             bw.WorkerSupportsCancellation = true;
  122.             bw.RunWorkerAsync(data);
  123.         }
  124.         static void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
  125.         {
  126.             var form = Form.ActiveForm as form1;
  127.             if (form != null)
  128.             {
  129.                 form.progress = e.ProgressPercentage;
  130.             }
  131.            
  132.         }
  133.         static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  134.         {
  135.            
  136.             if (e.Cancelled)
  137.             { return; }
  138.  
  139.             if (e.Error != null) { return; }
  140.             else
  141.             {
  142.                 workdata outputdata = e.Result as workdata;
  143.                 var form = Form.ActiveForm as form1;
  144.                 if (form != null)
  145.                 {
  146.                     for (int z = 0; z < outputdata.vysledky.Count; z++)
  147.                     {
  148.                         form.casanalyzy.Enabled = false;
  149.                         form.richTextBox1.AppendText(outputdata.vysledky[z] + " -nalezeno: " + outputdata.pocty[z] + "*\r\n");
  150.                     }
  151.                 }
  152.             }
  153.         }
  154.         static void bw_DoWork(object sender, DoWorkEventArgs e)
  155.         {
  156.             //přimeme argumenty
  157.             analyzepattern inputdata = e.Argument as analyzepattern;
  158.             ArrayList pocty = new ArrayList();
  159.             ArrayList vysledky = new ArrayList();
  160.             //a tady je práce...
  161.             //vygenerování polí pro výsledek a počet výsledků
  162.             pocty.Add(0);
  163.             vysledky.Add("Dokument neobsahuje nic podle zadaných kritérií (XPATH)");
  164.             DirectoryInfo dir = new DirectoryInfo(inputdata.folderpath);
  165.             FileInfo[] fi = dir.GetFiles("*.html");
  166.             Int32 p = 0;
  167.             foreach (FileInfo file in fi)
  168.             {
  169.                 //ověříme jestli nemáme přestat
  170.                 if (bw.CancellationPending)
  171.                 {
  172.                     e.Cancel = true;
  173.                     return; //proč je tu tohle?
  174.                 }
  175.                 //složka načtena, budeme zjišťovat co je obsah podle nadpisu h2
  176.                 HtmlAgilityPack.HtmlDocument dokument = new HtmlAgilityPack.HtmlDocument();
  177.                 dokument.Load(file.FullName, System.Text.Encoding.GetEncoding(28592)); //načte dokument se správným kódováním (volby.cz compatible)
  178.                 if (dokument.DocumentNode != null)
  179.                 {
  180.                     HtmlNode node = dokument.DocumentNode.SelectSingleNode(inputdata.xpath);
  181.                     try
  182.                     {
  183.                         string vysledek = node.InnerHtml.ToString();
  184.                         int i = 0;
  185.                         bool nalezeno = false;
  186.                         foreach (string zaznam in vysledky)
  187.                         {
  188.                             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
  189.                             else
  190.                             {
  191.                                 i++;
  192.                             }
  193.                         }
  194.                         if (!nalezeno)
  195.                         {
  196.                             vysledky.Add(vysledek); //přidá nový výsledek do pole
  197.                             pocty.Add(1);
  198.                         }
  199.                         else if (nalezeno) { pocty[i] = 1 + Convert.ToInt32(pocty[i].ToString()); i++; p++; } //inkrementuje počet nalezených výsledků
  200.  
  201.                         else
  202.                         {
  203.                             pocty[0] = 1 + Convert.ToInt32(pocty[0].ToString());
  204.                             p++;
  205.                         }
  206.                     }
  207.  
  208.  
  209.                     catch (NullReferenceException)
  210.                     {
  211.                         pocty[0] = 1 + Convert.ToInt32(pocty[0].ToString()); //pokud není H2
  212.                     }
  213.                 }
  214.                 else
  215.                 {
  216.                     pocty[0] = 1 + Convert.ToInt32(pocty[0].ToString()); //pokud není dokument?
  217.                 }
  218.  
  219.  
  220.                 bw.ReportProgress(p);  
  221.             }
  222.             //odešleme výsledek metodě runworkercompleted
  223.             workdata outputdata = new workdata();
  224.             outputdata.vysledky = vysledky;
  225.             outputdata.pocty = pocty;
  226.             e.Result = outputdata;
  227.         }
  228.         public static void cancelbw()
  229.         {
  230.             if (bw.WorkerSupportsCancellation)
  231.             {
  232.                 bw.CancelAsync();  
  233.             }
  234.         }
  235.  
  236.  
  237.         //
  238.         //analýza jednotlivých volebních ročníků
  239.         //
  240.         //
  241.         //1996 - 2002
  242.         //
  243.         static BackgroundWorker bw2002 = new BackgroundWorker();
  244.         public static void Analyze2002(object data)
  245.         {
  246.             bw2002.DoWork += new DoWorkEventHandler(bw2002_DoWork);
  247.             bw2002.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw2002_RunWorkerCompleted);
  248.             bw2002.ProgressChanged += new ProgressChangedEventHandler(bw2002_ProgressChanged);
  249.             bw2002.WorkerReportsProgress = true;
  250.             bw2002.WorkerSupportsCancellation = true;
  251.             bw2002.RunWorkerAsync(data);
  252.         }
  253.  
  254.         static void bw2002_ProgressChanged(object sender, ProgressChangedEventArgs e)
  255.         {
  256.             var form = Form.ActiveForm as form1;
  257.             if (form != null)
  258.             {
  259.                 form.progress = e.ProgressPercentage;
  260.             }
  261.         }
  262.  
  263.         static void bw2002_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  264.         {
  265.             if (e.Cancelled)
  266.             { return; }
  267.  
  268.             if (e.Error != null) { return; }
  269.             else
  270.             {
  271.                 workdata outputdata = e.Result as workdata;
  272.                 var form = Form.ActiveForm as form1;
  273.                 if (form != null)
  274.                 {
  275.                     form.casanalyzy.Enabled = false;
  276.                     return;
  277.                 }
  278.             }
  279.         }
  280.  
  281.         static void bw2002_DoWork(object sender, DoWorkEventArgs e)
  282.         {
  283.             //zpracujeme argumenty
  284.             analyzepattern inputdata = e.Argument as analyzepattern;
  285.             logsys.WriteLogEntry("Pracovní vlákno aktivní! BW2002 pracuje...", inputdata.form);
  286.             DirectoryInfo dir = new DirectoryInfo(inputdata.folderpath);
  287.             FileInfo[] fi = dir.GetFiles("*.html"); //!!!HTML NEBO HTM
  288.             Int32 p = 0; //počet zpracovaných souborů
  289.             foreach (FileInfo file in fi)
  290.             {
  291.                 //ověříme jestli nemáme přestat
  292.                 if (bw2002.CancellationPending)
  293.                 {
  294.                     e.Cancel = true;
  295.                     return; //proč je tu tohle?
  296.                 }
  297.                 //složka načtena, budeme zjišťovat co je obsah podle nadpisu h2
  298.                 HtmlAgilityPack.HtmlDocument dokument = new HtmlAgilityPack.HtmlDocument();
  299.                 dokument.Load(file.FullName, System.Text.Encoding.GetEncoding(28592)); //načte dokument se správným kódováním (volby.cz compatible)
  300.                 if (dokument.DocumentNode != null)
  301.                 {
  302.                     //ověříme jestli se jedná o stránku SPRÁVNÉHO výsledku
  303.                     HtmlNodeCollection bnodes = dokument.DocumentNode.SelectNodes("//b"); //vytáhne <B>čka (musí být 3)
  304.                     HtmlNode bnode = dokument.DocumentNode.SelectSingleNode("//b[1]"); //vytáhne první... další kontrola dokumentu
  305.                     HtmlNode node = dokument.DocumentNode.SelectSingleNode("//font[@size='+0']"); //vytáhne "nadpis"
  306.                     if (bnodes != null & node != null)
  307.                     {
  308.                         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
  309.                         //ten string je česky, není potřeba filtrovat ještě podle kódování (ověřit, že aj verze neobsahuje český string!)
  310.                         {//dobře, pokud jsme tady je to dobrá stránka teď potřebujeme ID obce
  311.                             HtmlNode citynamenode = dokument.DocumentNode.SelectSingleNode("//b[3]"); //vytáhne "nadpis" -11 prvních znaků
  312.                             string cityname = citynamenode.InnerText.ToString();
  313.                             if (cityname.Contains("Přebírací místo:"))
  314.                             {
  315.                                 continue;
  316.                             }
  317.                             cityname = cityname.Replace("&nbsp;", " ");
  318.                             cityname = cityname.Remove(0, 6);
  319.                             int cityid = dbo.getcityid(cityname);
  320.                             if (cityid == -1) //v roce 1996,1998 je potřeba ješte odstranit číslo obce
  321.                             {
  322.                                 try
  323.                                 {  
  324.                                 cityname = cityname.Remove(0, 7);
  325.                                 cityid = dbo.getcityid(cityname);
  326.                                 }
  327.                                 catch (Exception)
  328.                                 {
  329.                                     logsys.WriteLogEntry("ERROR0: Obec není v databázi! obec: " + cityname + " soubor: " + file.FullName, inputdata.form);
  330.                                     continue; //můžeme soubor rovnou přeskočit
  331.                                 }
  332.                             }
  333.  
  334.                             //zjistíme nevoliče
  335.                             HtmlNode voliciinput = dokument.DocumentNode.SelectSingleNode("//table[1]/tr/td[4]");
  336.                             HtmlNode platnehlasyinput = dokument.DocumentNode.SelectSingleNode("//table[1]/tr/td[8]");
  337.                             if (voliciinput == null | platnehlasyinput == null)
  338.                             {
  339.                                 logsys.WriteLogEntry("ERROR1: nepodařilo se vytvořit záznam (problém s cityname:"+cityname+") + soubor: " + file.FullName, inputdata.form);
  340.                                 continue;
  341.                             }
  342.                             string volici = voliciinput.InnerText.ToString();
  343.                             string platnehlasy = platnehlasyinput.InnerText.ToString();
  344.  
  345.                             volici = volici.Replace(" ", string.Empty);
  346.                             volici = volici.Replace("&nbsp;", string.Empty);
  347.                             platnehlasy = platnehlasy.Replace(" ", string.Empty);
  348.                             platnehlasy = platnehlasy.Replace("&nbsp;", string.Empty);
  349.                             int pocetnevolicu = ((Convert.ToInt32(volici)) - (Convert.ToInt32(platnehlasy)));
  350.                             if (cityid != -1)
  351.                             {
  352.                              //   dbo.zapisvysledek(inputdata.year, cityid, -1, pocetnevolicu); //-1 se interpretuje jako null
  353.                             }
  354.                             else
  355.                             {
  356.                                 logsys.WriteLogEntry("ERROR2: nepodařilo se vytvořit záznam (nevoliči) - cityname: " + cityname + " počet nevoličů: " + pocetnevolicu + " soubor: "+file.FullName, inputdata.form);
  357.                             }
  358.  
  359.                       @@      //zjistíme jednotlivé výsledky
  360.  
  361.                             HtmlNodeCollection tabulkavysledku = dokument.DocumentNode.SelectNodes("//table[2]/tr/td[1]"); //první polovina tabluky
  362.                             if (tabulkavysledku == null)
  363.                             {
  364.                                 logsys.WriteLogEntry("ERROR3: nepodařilo se vytvořit záznam - chybá tabulka výsledků + soubor: " + file.FullName, inputdata.form);
  365.                                 continue;
  366.                             }
  367.                             else
  368.                             {
  369.                                 foreach (var vysledek in tabulkavysledku)
  370.                                 {
  371.                                     int v1sid = -1;
  372.                                     int v1v = -1;
  373.                                     foreach (HtmlNode row in vysledek.SelectNodes("//tr"))
  374.                                     {
  375.                                        
  376.                                         try
  377.                                         {
  378.                                             int oldsid = v1sid;
  379.                                             HtmlNode snode = row.SelectSingleNode("td[1]");
  380.                                             HtmlNode vnode = row.SelectSingleNode("td[3]");
  381.                                             string sid = snode.InnerText.ToString();
  382.                                             string votes = vnode.InnerText.ToString();
  383.                                             sid = sid.Replace(" ", string.Empty);
  384.                                             sid = sid.Replace("&nbsp;", string.Empty);
  385.                                             votes = votes.Replace(" ", string.Empty);
  386.                                             votes = votes.Replace("&nbsp;", string.Empty);
  387.                                             try
  388.                                             {
  389.                                                 v1sid = Convert.ToInt32(sid);
  390.                                                 v1v = Convert.ToInt32(votes);
  391.                                                 if (v1sid == oldsid)
  392.                                                 {
  393.                                                     continue;
  394.                                                 }
  395.                                             }
  396.                                             catch (Exception)
  397.                                             {
  398.                                                 //logsys.WriteLogEntry("vadná řádka" + vysledek.InnerText.ToString(), inputdata.form);
  399.                                                 continue;
  400.                                             }
  401.                                             finally
  402.                                             {
  403.                                                 if (cityid != -1 & v1sid != -1 & v1v != -1)
  404.                                                 {
  405.                                                     dbo.zapisvysledek(inputdata.year, cityid, v1sid, v1v);
  406.                                                     //logsys.WriteLogEntry("Výsledek: obec: " + cityid.ToString() + " Strana: " + v1sid.ToString() + " hlasy: " + v1v.ToString(), inputdata.form);
  407.                                                 }
  408.                                                 else
  409.                                                 {
  410.                                                     logsys.WriteLogEntry("nepodařilo se vytvořit záznam pro: " + cityname, inputdata.form);
  411.                                                 }
  412.                                             }
  413.                                         }
  414.                                         catch (Exception)
  415.                                         {
  416.                                             continue;
  417.                                         }
  418.                                        
  419.  
  420.                                     }
  421.                                  }
  422.                             }
  423.  
  424.                            
  425.  
  426.  
  427.                         }
  428.                     }
  429.                     else
  430.                     {
  431.                         p++; //inkrementuje počet zpracovaných soubrů
  432.                         bw2002.ReportProgress(p);
  433.                         continue;
  434.                     }
  435.                    
  436.                 }
  437.                 else
  438.                 {
  439.                     p++; //inkrementuje počet zpracovaných soubrů
  440.                     bw2002.ReportProgress(p);
  441.                     continue;
  442.                 }
  443.  
  444.  
  445.                 p++; //inkrementuje počet zpracovaných soubrů
  446.                 bw2002.ReportProgress(p);
  447.             }
  448.            
  449.            
  450.            
  451.         }
  452.         public static void cancelbw2002()
  453.         {
  454.             if (bw2002.WorkerSupportsCancellation)
  455.             {
  456.                 bw2002.CancelAsync();  
  457.             }
  458.         }
  459.  
  460.     }
  461. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement