Discussioni modulo:Sandbox/ValterVB/Istat/Data

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

Non più funzionante[modifica wikitesto]

Questa procedura sarebbe da modificare perché i dati ISTAT sono cambiati sul sito. (24/11/2023)

Come si usa[modifica wikitesto]

Modulo da caricare su AWB per aggiornare il bilancio demografico ISTAT. Vedere (EN) Wikipedia:AutoWikiBrowser/Custom Modules per maggiori informazioni sulla creazione dei moduli.

Procedura:

  • Selezionare dal menù di AWB Tools e poi Make module
  • Nella finestra che si apre copiare il sottostante codice nella casella di testo in basso
  • Modificare Anno e mese indicando quelli del periodo da cui si vuole estrarre i dati
  • Premere sul pulsante Make module in alto a destra
  • Se tutto va bene in alto a destra appare la scritta Custom Module Build at data+ora
  • Su AWB inserire la pagina Wiki con i dati ISTAT da aggiornare nella casella delle pagine da aggiornare in basso a sinistra
  • Premere Start, entro 1 minuto l'eleborazione è completata, verificare se è tutto a posto e salvare la pagina.
        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            //*********************************************************************************************
            int Anno = 2020; // Indicare anno da cui estrarre dato
            int Mese = 05; // Indicare mese da cui estrarre dato
            int MaxProvincia = 113; //N° massimo indicatore della provincia usato da ISTAT, attualmente 113
            //*********************************************************************************************
            
            //ArticleTitle contiene l'attuale contenuto della pagina
            Skip = false; //parametro della procedura in AWB
            Summary = "Aggiornamento dati ISTAT: "+ Anno.ToString() + " " + Mese.ToString(); //Sommario della modifica
            
            //Regex per estrarre i singoli dati. es. ["010001"]={11270,2020,3,10}
            //nell'ordine: codice ISTAT del comune, N° abitanti fine mese, anno, mese, e cod. provincia.
            Regex regex = new Regex(@"\[""(\d*)""\]={(\d+),(\d+),(\d+),(\d+)}"); 

            // Aggiungo al dizionario dati dei comuni da wiki
            var wiki = new Dictionary<string, string>();  //Dizionario con i dati della pagina Wiki, la chiave è il codice del comune
            string[] righe = ArticleText.Split(new string[] { "\r\n" }, StringSplitOptions.None);
            foreach (string riga in righe)
            {
                Match match = regex.Match(riga);
                if (match.Success)
                {
                    wiki.Add(match.Groups[1].Value, match.Groups[0].Value);
                }
            }

            // Aggiungo al dizionario i dati dei comuni letti da ISTAT
            var istat = new Dictionary<string, string>(); //Dizionario con i dati ISTAT, la chiave è il codice del comune
            System.Net.WebClient client = new System.Net.WebClient();
            for (int idProvincia = 1; idProvincia <= MaxProvincia; idProvincia++) // Loop su tutte le provincie per estrarre i dati ISTAT
            {
                //Richiesta GET al sito ISTAT
                // es. link:   http://demo.istat.it/bilmens/query1.php?&allrp=4&Pro=1&periodo=5
                string Link = "http://demo.istat.it/bilmens" + Anno + "gen/query1.php?&allrp=4&Pro=" + idProvincia + "&periodo=" + Mese;
                System.IO.Stream data = client.OpenRead(Link);
                System.IO.StreamReader reader = new System.IO.StreamReader(data);
                string result = reader.ReadToEnd();
                //Elaborazione pagina e inserimento nel dizionario
                string Title = "";
                if (result.IndexOf("Bilancio demografico") != -1)
                {
                    //Estrazione titolo della pagina ISTAT, è la prima <table>
                    //Attualmente non usato ma si può usare come testo per il ref
                    //es: Bilancio demografico anno 2020 - Aprile (dati provvisori)
                    int from = result.IndexOf("<table");
                    int to = result.IndexOf("</table>", from);
                    string table1 = result.Substring(from, to - from);
                    if (Title == "")
                    {
                        from = table1.IndexOf("<b>");
                        to = table1.IndexOf("<br>");
                        Title = table1.Substring(from + 3, to - from - 3);
                    }
                    //Estrazione dei risultati, è la seconda <table>
                    from = result.IndexOf("<table", result.IndexOf("</table>"));
                    to = result.IndexOf("</table>", from);
                    string table2 = result.Substring(from, to - from + 8);

                    string RowExpression = "<tr[^>]*>(.*?)</tr>";
                    string ColumnExpression = "<td[^>]*>(.*?)</td>";

                    MatchCollection Rows = Regex.Matches(table2, RowExpression, RegexOptions.Multiline | RegexOptions.Singleline);
                    foreach (Match Row in Rows) //Loop sulle righe della tabella
                    {
                        if (Row.Value.IndexOf("<td class=\"f10t1\">Codice comune</td>") == -1) //Escludo l'intestazione
                        {
                            if (Row.Value.IndexOf("Maschi") != -1) { break; } //Dati dei soli maschi attualmente non serve
                            if (Row.Value.IndexOf("Femmine") != -1) { break; } //Dati dei soli maschi attualmente non serve

                            MatchCollection Columns = Regex.Matches(Row.Value, ColumnExpression);
                            if (Columns[0].Groups[1].Captures[0].Value != "Totale") //Loop sulle colonne della riga della tabella
                            {
                                string tmp = "[\"" + Columns[0].Groups[1].ToString() + "\"]={" + Columns[10].Groups[1].ToString() + "," + Anno + "," + Mese + "," + idProvincia + "}";
                                istat.Add(Columns[0].Groups[1].ToString(), tmp);
                            }
                        }
                    }
                }
            }            

            //Inizio confronto fra i 2 dizionari e scrivo risultato
            //Se il codice comune esiste nei 2 diz. scelgo il più recente
            //Se non esiste sulla pagina Wiki lo aggiungo
            //Se esiste solo sulla vecchia pagina Wiki la aggiungo
            string risultato = "local data = {}" + Environment.NewLine + Environment.NewLine;
            risultato += "data.popolazione={";
                // Loop su dati ISTAT per dati modificati o aggiunti
                foreach (var riga in istat)
            {
                Match DatiIstat = regex.Match(riga.Value);
                if (wiki.ContainsKey(riga.Key)) 
                {
                    Match DatiWiki = regex.Match(wiki[riga.Key]);
                    if (Int16.Parse(DatiIstat.Groups[3].Value)*100 + Int16.Parse(DatiIstat.Groups[4].Value) > Int16.Parse(DatiWiki.Groups[3].Value)*100 + Int16.Parse(DatiWiki.Groups[4].Value))
                    {
                        risultato += Environment.NewLine + DatiIstat.Groups[0].Value + ","; //aggiorno se esiste dato più aggiornato 
                    }
                    else
                    {
                        risultato += Environment.NewLine + DatiWiki.Groups[0].Value + ","; //mantengo dato 
                    }
                }
                else
                {
                    //Aggiungo perché non presente su wiki
                    risultato += Environment.NewLine + DatiIstat.Groups[0].Value + ",";
                }
            }
            // Loop su dati Wiki per dati non aggiornati da ISTAT
            foreach (var riga in wiki)
            {
                if (!istat.ContainsKey(riga.Key))
                {
                    //aggiungo perché non presente su ISTAT
                    Match DatiWiki = regex.Match(wiki[riga.Key]);
                    risultato += Environment.NewLine + DatiWiki.Groups[0].Value + ",";
                }
            }
            risultato = risultato.Remove(risultato.LastIndexOf(","));
            risultato += Environment.NewLine + "}" + Environment.NewLine + "return data";
            ArticleText = risultato;
            return ArticleText;
        }