Advertisement
thebys

1996-2002 funkční analýza volebních výsledků z html

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