Visual Basic.NET: un programma per gestire i dati del Fantacalcio

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.

FantaNet

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 item che contiene il codice giocatore'
lvi = ListView1.Items.Add(StringArray(0))

'controllo il ruolo e in base al valore metto la lettera 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!

18 thoughts on “Visual Basic.NET: un programma per gestire i dati del Fantacalcio

  1. Ciao,
    Anche io sto realizzando un programma molto simile al tuo in quando ho la necessita di leggere dei campi da un file csv che è delimitato appunto da “;”.
    Questi campi io li metto in un array di stringhe. Le stringhe poi le importo in una datagridview.
    Fin qui tutto bene ma ho anche la necessità di poter modificare i dati in tabella e di reinserire nell’array di stringhe i dati modificati.
    Per poterlo fare ho settato le colonne come modificabili e effettivamente il testo si modifica. Il mio problema adesso è: come faccio a prendere dalle celle della tabella le stringhe, per poi poterle copiare sulle variabili dell’array??
    Mi puoi rispondere anche sull’email così mi ricordo di passare a vedere la risposta ;P

    Ciao e grazie anticipatamente

  2. Ciao ragazzi sto cercando un programmatore in visual basic che mi possa progettare un programma per la gestione del fantacalcio al quale io partecipo, sono disposto anche a pagare, l’importante e che non sia una cifra esorbitante. Chiunque fosse intenzionato ad aiutarmi puo’ contattarmi al seguente indirizzo di posta:
    marconi82@hotmail.it

  3. CiaO PIU CHE UN COMMENTO VOLEVO CHIEDERE UN AIUTO :
    IO HO DATI NEL SEGUENTE FORMATO :

    BLABLABLA
    BLABLABLA
    BLABLABLA

    ECCO VOLEVO CREARE UN ARRAY DI N ELEMENTI QUANTE SONO LE RIGHE DI CUI SOPRA (QUINDI 3 ELEMENTI);
    HO PROVATO CON IL SEGUENTE CODICE

    DIM ARRAY() AS STRING
    ARRAY= SPLIT(PIPPO, “\N”)

    pippo naturalemnte contiene i miei dati si cui sopra;
    fatto questo la lunghezza del mio array rimane 0,
    ho provato anche con ‘vbCrLf’ ma nulla ….
    qualcuno mi aiuta

  4. Ciao..volevo sapere se era possibile avere una copia di questo tuo fantacalcio data capture visto che io non sono molto afferrato in informatica e devo gestire una fantalega coi voti della gazzetta.
    Grazie

  5. Certo. Ti ho mandato una copia del programma all’indirizzo email che hai lasciato al momento dell’inserimento del tuo commento (sperando che tu abbia inserito un indirizzo reale). Per semplicità ti ho mandato lo zip con tutto il sorgente; vai nella cartella bin e lancia l’eseguibile. Perché funzioni devi aver installato il framerwork .NET 2.0. In più non so se il formato dei file di testo di aggiornamento della Gazzetta è cambiato, in tal caso le cose potrebbero non funzionare e sarebbero necessarie delle modifiche di adattamento.
    Saluti.

  6. No, per il semplice fatto che quest’anno niente fantacalcio e di conseguenza non ho neanche visto il nuovo formato dei files dei punteggi della Gazzetta. Al momento non credo di trovare il tempo per darci un’occhiata, magari un po’ più avanti. Anche perché volevo ampliare il programma inserendo la funzione per il calcolo automatico del punteggio della squadra e altre cose utili. Ma adesso di sicuro non rientra tra le priorità.

  7. Ciao, i files della Gazzetta di questa nuova edizione sono cambiati, quindi, ad oggi, il programma è inutilizzabile. Se poi ti interessa come codice te lo mando (anche se è praticamente tutto illustrato nel post).

  8. mi ha troncato il messaggio… dho!

    cmq sto lavorando ai nuovi file quotazioni (quest’anno ci volgiono proprio male!! ;-pp)

    e una kikka per il gestionale on-line: ho intenzione di implementare un sistema sms che permetta di nn dipendere da internet per quanto riguarda consegna squadre o altre info….

    coming soon
    4r3s

  9. ave
    io se fossi in voi domani sul tardi andrei a farci una visitina sul mio sito…
    qualche interessante novità da “scaricare”!!!

    a buon intenditor…

  10. Ciao..anche io volevo sapere se era possibile avere una copia di questo tuo fantacalcio data capture visto che io non sono molto afferrato in VB e devo fare una cosa simile.

Leave a Reply to vincenzo Cancel reply

Your email address will not be published. Required fields are marked *