Discussioni modulo:Sandbox/ValterVB/Istat/Data
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 poiMake 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;
}