Sono un gran appassionato di Fantacalcio, il gioco de “La Gazzetta Dello Sport”, dove si costruisce la propria squadra e si calcolano i punteggi in base ai voti, goal, ecc.
Bene, ogni settimana sul sito della Gazzetta vengono pubblicati i file .txt che contengono pagelle, voti, statistiche, ecc e che costituiscono gli aggiornamenti per il programma Magic Manager 5.0 che viene venduto insieme al giornale. Vediamo di sfruttare questi file di aggiornamento anche se non abbiamo comprato il cd-rom di Magic Manager.
Il programmino che ho fatto, prende in input questi file di testo disponibili sul sito, estrae le informazioni e le presenta all’utente in modo immediato attraverso un controllo ListView.
Per avere subito le idee chiare piazziamo subito qui uno screenshot, anche se rimpicciolito non si vede molto bene. Quì si vede meglio.

Permette poi di salvare i dati estratti su un file di testo in modo più leggibile. Partiamo dalla struttura del file di input. E’ una cosa di questo genere:
118;1;”CHIMENTI Antonio”;”JUVENTUS”;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;2
119;1;”CURCI Gianluca”;”ROMA”;1;0;1;6;0;1;6;0;0;0;0;0;0;0;0;0;0;0;0;1;1;0;1;15
120;1;”DE ANGELIS Alessio”;”LAZIO”;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1
121;1;”DE LUCIA Alfonso”;”PARMA”;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1
122;1;”DE SANCTIS Morgan”;”UDINESE”;1;0;1;7;0;1;7;0;0;0;0;0;0;0;0;0;0;0;0;1;1;0;0;16
123;1;”DIDA Nelson De Jesus Silva”;”MILAN”;1;0;1;5;0;1;6;0;1;0;0;0;0;0;0;0;0;0;0;1;1;0;1;21
124;1;”ELEFTHEROPOULOS Dimitrios”;”MILAN”;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;2
125;1;”FIORI Valerio”;”MILAN”;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1
126;1;”FONTANA Alberto”;”CHIEVO”;1;0;1;6;0;1;7;0;1;0;0;0;0;0;0;0;0;0;0;1;1;0;1;9
. . . .
. . . .
Si nota subito che i dati sono separati tra loro da un ‘;’ e quindi dobbiammo spezzare la stringa in vari token utilizzando come delimitatore proprio il simbolo ‘;’
In Visual Basic.NET la funzione che ci permette di fare questo è ‘Split()’, vediamo un esempio di come si usa:
Dim StringArray() As String
StringArray = Split(riga, “;”)
si intuisce subito facilmente che ‘riga’ è la stringa da splittare e ‘;’ il delimitatore da usare. Nel caso in cui il delimitatore venga omesso ( Split(riga) ) viene considerato come delimitatore di default lo spazio ‘ ‘.
A questo punto abbiamo splittato la stringa nei vari campi; vediamo come usarli.
Il primo campo 101,102,ecc.. rappresenta il codice dei giocatori, il secondo indica la giornata di campionato a cui si riferisce il file di aggiornamento (nell’esempio la prima giornata), poi c’è il nome, la squadra e poi dei dati statistici come il voto in pagella, il voto “al netto” dei bonus e malus, goal, assist, ammonizioni, espulsioni e quotazione del giocatore. La cosa importante da notare che ho scoperto analizzando il file è che per determinare il ruolo del giocatore, portiere, difensore, centrocampista o attaccante, occorre fare un confronto sul token di indice 5 (ricordando che si parte a 0); se esso vale 0 il giocatore è un portiere, 1 difensore, 2 centrocampista, 3 attaccante.
Ok, abbiamo capito cosa fare, facciamolo:
Prima cosa, aprire il file e leggerlo riga per riga:
Dim riga As String
Dim objReader As StreamReader
Dim StringArray() As String
Dim lvi As New ListViewItem
OpenFileDialog1.Filter = "Txt files (*.txt)|*.txt"
If OpenFileDialog1.ShowDialog = DialogResult.OK Then
objReader = New StreamReader(OpenFileDialog1.FileName)
Else
Exit Sub
End If
riga = objReader.ReadLine()
While Not riga Is Nothing
poi splittiamo la stringa come visto in precedenza
StringArray = Split(riga, ";")
adesso mettiamo al loro posto corretto nella ListView tutti i dati recuperandoli dall’array dei token con la sintassi StringArray(i)
'aggiungo l'item che contiene il codice giocatore
lvi = ListView1.Items.Add(StringArray(0))
'controllo il ruolo e in base al valore metto l'iniziale
If StringArray(5) = "0" Then
lvi.SubItems.Add("P")
ElseIf StringArray(5) = "1" Then
lvi.SubItems.Add("D")
ElseIf StringArray(5) = "2" Then
lvi.SubItems.Add("C")
ElseIf StringArray(5) = "3" Then
lvi.SubItems.Add("A")
End If
adesso dobbiamo prendere il nome e la squadra, che mostrano però una piccola differenza rispetto agli altri campi, ovvero sono racchiusi tra ‘”‘. E noi le ‘”‘ non le vogliamo!!
Nulla di complicato, ci viene in aiuto la funzione Substring da applicare alla stringa dalla quale vogliamo estrarre una sottostringa. La sintassi è stringa.Substring(x,y) dove x è l’indice del carattere da cui partire ad acquisire la sottostringa e y è la lunghezza della sottostringa. Quindi ci basterà partire dal carattere di indice 1 (cioè il secondo, il primo è la ‘”‘) e acquisirne 2 in meno della lunghezza della stringa, che sono proprio le 2 ‘”‘. Ecco qua:
lvi.SubItems.Add(StringArray(2).Substring(1, StringArray(2).Length - 2))
lvi.SubItems.Add(StringArray(3).Substring(1, StringArray(3).Length - 2))
'inserisco Magic Voto e pagella normale
lvi.SubItems.Add(StringArray(7))
lvi.SubItems.Add(StringArray(10))
Altre scelte di implementazione da spiegare per quanto riguarda la gestione dei goal: se il giocatore è un portiere il numero deve essere preceduto da un meno ‘-’ perchè sono goal subiti, mentre se è un giocatore diverso dal portiere no; inoltre analizzando sempre il file ho notato che i goal per i portieri si trovano nel token 12 mentre per gli altri giocatori nel token 11. Se non ci sono goal nella ListView non visualizzo niente per evitare di riempire tutto di zeri ‘0′. Quest’ultimo discorso vale anche per gli assist, token di indice 15. Risultato:
If StringArray(5) = "0" And StringArray(12) <> "0" Then
lvi.SubItems.Add("-" & StringArray(12))
ElseIf StringArray(11) <> "0" Then
lvi.SubItems.Add(StringArray(11))
Else
lvi.SubItems.Add("”)
End If
If StringArray(15) <> "0" Then
lvi.SubItems.Add(StringArray(15))
Else
lvi.SubItems.Add("”)
End If
Per ammonizioni ed espulsioni devo controllare se nel campo apposito è presente un ‘1′ o uno ‘0′. Se c’è 1 il giocatore è stato ammonito/espulso e metto ’si’ altrimenti non visualizzo niente
If StringArray(16) = "1" Then
lvi.SubItems.Add("Si")
Else
lvi.SubItems.Add("”)
End If
If StringArray(17) = "1" Then
lvi.SubItems.Add("Si")
Else
lvi.SubItems.Add("”)
End If
Aggiungo gli ultimi campi e leggo la prossima riga
'aggiungo la quotazione del giocatore
lvi.SubItems.Add(StringArray(27))
'LEGGO UNA NUOVA RIGA
riga = objReader.ReadLine()
End While
'il token che contiene la giornata
Label1.Text = "Statistiche Magic Cup Campionato" & vbCrLf & StringArray(1) & " Giornata"
objReader.Close()
Preciso che in questo programma non c’è niente di male. I dati sarebbero reperibili direttamente dai file originali senza troppi problemi. In questo modo vengono solo mostrati in modo più comprensibile.
Buon FantaCalcio a tutti!