Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
27/10/21 20:49
Giacos71
Salve sto cercando di venirne a capo da solo ma ci sto sbattendo la testa, dovrei scaricare l'archivio estrazioni del lotto e caricarlo in un DataSet cosa penso di aver fatto, poi elaborare riga per riga, e ogni riga splittarla con la funzione Split() cosa che ho fatto e riempire i vari campi.
La struttura è cosi composta Data,Ruota,Estratto1, Estratto2, ecc: "2021/09/18 BA 19 82 17 54 76" e così per tutte le righe per tutto il file.

Riesco a leggere il file e ha splittare una singola riga (come di esempio nella variabile str) ma probabilmente qualcosa manca, visto che dovrei passargli l'intero archivio. Qui di seguito il codice finora buttato giù, sicuramente qualcosa manca, tutte righe commentate le ho messe così per capire dove stavo sbagliando.

Ho messo anche un datagridview per avere un riscontro visivo come stavo procedendo. Da tenere conto che non metto mani al codice da almeno 10 anni, qualsiasi consiglio/suggerimento è ben accetto!

'Nuovo DataTable Estrazioni
        Dim Archivio As DataTable = New DataTable("Estrazioni")
        'Crea la Chiave Primaria ID
        Dim ID_PK As DataColumn = Archivio.Columns.Add("ID", GetType(Int32))
        ID_PK.AllowDBNull = False
        ID_PK.Unique = True
        'Crea le colonne appropriate
        Archivio.Columns.Add("Data", GetType(Date))
        Archivio.Columns.Add("Ruota", GetType(String))
        Archivio.Columns.Add("Estratto1", GetType(Double))
        Archivio.Columns.Add("Estratto2", GetType(Double))
        Archivio.Columns.Add("Estratto3", GetType(Double))
        Archivio.Columns.Add("Estratto4", GetType(Double))
        Archivio.Columns.Add("Estratto5", GetType(Double))

        ' Carica il file storico.txt della Lottomatica e legge tutte le righe
        Try
            ' La variabile RecordArchivioTXT conterrà tutte le
            ' righe lette dal file C:\MyFile.Txt file.
            Dim RecordArchivioTXT As String = ""
            ' Il file da leggere è C:\storico71-00_B.txt
            Dim FileName As String = "C:\storico71-00_B.txt"
            ' Controllo se il file esiste.
            If System.IO.File.Exists(FileName) = True Then
                ' Carico il file nell'oggetto StreamReader.
                Dim StreamReader As New System.IO.StreamReader(FileName)
                ' Metto tutte le righe del file
                ' nella variabile RecordArchivioTXT.
                RecordArchivioTXT = StreamReader.ReadToEnd
                ' Mostro le righe del file.
                MessageBox.Show("" & RecordArchivioTXT)
                ' Chiudo l'oggetto StreamReader.
                StreamReader.Close()
            End If
        Catch ex As Exception
            ' Mostro l'errore se la sub genera un errore.
            MessageBox.Show("Error message: " & ex.Message)
        End Try

        'Crea un nuova riga nella variabile Archivio DataTable
        Dim RecordArchivio As DataRow = Archivio.NewRow()

        ''Routine divisione Riga Archivio in parti
        'Dim str As String
        'Dim strArr() As String
        'Dim count As Integer
        'str = "1971/01/02	NA	41	34	62	47	71"
        'strArr = str.Split()
        'For count = 0 To strArr.Length - 1
        '    MessageBox.Show(strArr(count))
        'Next

        'Routine divisione Riga Archivio in parti
        Dim str As String
        Dim strArr() As String
        Dim count As Integer
        str = "1971/01/02	NA	41	34	62	47	71"
        strArr = str.Split()
        For count = 0 To strArr.Length - 1
            MessageBox.Show(strArr(count))
        Next

        'Ciclo inserimento valori dati fittizzi
        For i As Integer = 1 To 5
            'RecordArchivio = Archivio.NewRow()
            'RecordArchivio(0) = i
            'RecordArchivio(1) = Date.Today
            'RecordArchivio(2) = strArr(2).ToString '"BA " & i.ToString()
            'RecordArchivio(3) = strArr(3).ToString '19 '& i '.ToString()
            'RecordArchivio(4) = strArr(4).ToString '82 '& i '.ToString()
            'RecordArchivio(5) = strArr(5).ToString '17 '& i '.ToString()
            'RecordArchivio(6) = strArr(6).ToString '54 '& i '.ToString()
            'RecordArchivio(7) = strArr(7).ToString '76 '& i '.ToString()
            Archivio.Rows.Add(RecordArchivio)
        Next

        'Mostra i dati del DataTable in DataGridView1
        DataGridView1.DataSource = Archivio


La seconda questione e se tenere il dataset e lavorare da li o creare un database per l'elaborazione modifica dei dati, ma questa è un'altra questione.
Ultima modifica effettuata da Giacos71 27/10/21 20:51
aaa
28/10/21 7:56
nessuno
Ho letto che ti hanno spiegato tutto in

masterdrive.it/visual-basic-net-18/creazione-gestione-archivio-gioco-lotto-103406/…

a parte il codice da scrivere, ovviamente

Comunque, se hai il file di testo con i dati e il DB, non servono a nulla DataTable o altra roba, direttamente leggi il testo, separi i dati con la Split e inserisci nel DB con le INSERT corrette secondo lo schema di tabelle e relazioni che hai fatto (te le hanno suggerite mi pare)
Ultima modifica effettuata da nessuno 28/10/21 8:17
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
28/10/21 8:50
Thejuster
Scusa se te lo dico, ma se manca qualcosa non tocca a noi saperlo essendo un programma che stai costruendo tu.

A mio parere, direi che è completamente tutto sbagliato.
L'intero modo di approccio al concetto stesso.

Leggi un file e lo aggiungi per intero in una stringa.


Dim FileName As String = "C:\storico71-00_B.txt"

...

 RecordArchivioTXT = StreamReader.ReadToEnd



Metti il file per intero nella variabile RecordArchivioTXT.
In seguito non vedo altre istruzioni che fanno riferimento a questa variabile che contiene il testo.
Ma solamente un ciclo per inserire valori nel Dataset o nel DataGrid.
E la domanda è: Da dove prendi i valori da inserire nel DataGrid se il testo è contenuto in RecordArchivioTXT ?


Fossi in te,
Andrei a leggere il file linea per linea e splittandone una per volta.
ed al tempo stesso aggiungendola direttamente al DataGridView evitando di fare ulteriori cicli inutilmente.
Ma non sapendo com'è stutturato il file, per intero più di questo non posso dirti.

sicuramente questa linea è formata così ed'è ok,

"2021/09/18 BA 19 82 17 54 76"

Ma le altre?
sono cooncatenate?
sono separate in altre linee?
c'è qualche simbolo per indentificare una nuova linea?
mire.forumfree.it/ - Mire Engine
C# UI Designer
28/10/21 10:35
Giacos71
Postato originariamente da nessuno:

Ho letto che ti hanno spiegato tutto in

masterdrive.it/visual-basic-net-18/creazione-gestione-archivio-gioco-lotto-103406/…

a parte il codice da scrivere, ovviamente

Comunque, se hai il file di testo con i dati e il DB, non servono a nulla DataTable o altra roba, direttamente leggi il testo, separi i dati con la Split e inserisci nel DB con le INSERT corrette secondo lo schema di tabelle e relazioni che hai fatto (te le hanno suggerite mi pare)


Si non lo nego che ho postato un post simile in tale forum, ma a me sembra che prima di dare aiuto trmite non so quale metodo viene fatta una ricerca se l'utente a messo lo stesso post in altro forum!
Tengo a precisare che non me la sono presa per l'osservazione, ma volevo solo sapere se è un reato chiedere aiuto in più punti oppure no. Se lo chiedo è perchè ne ho bisogno e ritengo il forum (o anche più di uno) un punto di riferimento.


Difatti ci si era fermati tanto sulla teoria poi finalmente ho buttato giù del codice però con l'unica riga di esempio funziona, ma passandogli il file di testo da errore mi pare che dica che non può fare la conversione di tipo qualcosa perchè presente un PK e parte scrivendo da li.

Si vorrei mettere poi tutto in un db anche se forse c'è qualcosa di dell'estensione .mdb, cmq ho sempre visto consigliato di utilizzare un dataset per lavorare con i dati in memoria e poi ne fa l'uso che più ne aggrada.

Probabilmente il mio errore e nel ciclo for perchè splitto la riga, ma poi per splittare la riga mi perdo, questo step andrebbe fatto riga x riga fino alla fine del file, ammetto le mie deficenze in materia.

Personalmente anche pseudo codice andrebbe più che tanto per capire la lgica, nel frattempo mi sto studiando qua la guida di Totem sul VB per migliorare.
Ultima modifica effettuata da Giacos71 28/10/21 10:38
aaa
28/10/21 11:16
Giacos71
Scusa se te lo dico, ma se manca qualcosa non tocca a noi saperlo essendo un programma che stai costruendo tu.


Si intendevo che così non funziona come dovrebbe!

A mio parere, direi che è completamente tutto sbagliato.
L'intero modo di approccio al concetto stesso.


Hai perfettamente ragione il codice fa un pò pena, sicuramente potrebbe migliorare.

Leggi un file e lo aggiungi per intero in una stringa.


Dim FileName As String = "C:\storico71-00_B.txt"

...

 RecordArchivioTXT = StreamReader.ReadToEnd



Metti il file per intero nella variabile RecordArchivioTXT.
In seguito non vedo altre istruzioni che fanno riferimento a questa variabile che contiene il testo.
Ma solamente un ciclo per inserire valori nel Dataset o nel DataGrid.
E la domanda è: Da dove prendi i valori da inserire nel DataGrid se il testo è contenuto in RecordArchivioTXT ?


In teoria i valori dovrei prenderli proprio da li caricati dal file di testo storico.txt salvato su disco scaricato dal sito della lottomatica(se serve il link lo metto).

Per ora avevo creato una copia modificata del file con solo venti righe per testare che funzionasse prima di utlizzare il file con l'archivio completo.

Fossi in te,
Andrei a leggere il file linea per linea e splittandone una per volta.
ed al tempo stesso aggiungendola direttamente al DataGridView evitando di fare ulteriori cicli inutilmente.
Ma non sapendo com'è stutturato il file, per intero più di questo non posso dirti.


E quello che sto cercando di fare: ad esempio se il file contiene 20 righe, prendere la prima riga, splittarla con la funzione Split(), e inserire i vari valori nel DataSet (la DatGridview è per avere un riscontro visivo. Il file e cosi strutturato:

1939/01/07    BA    58    22    47    49    69
1939/01/07    FI    27    57    81    43    61
1939/01/07    MI    40    38    57    67    7
1939/01/07    NA    85    44    48    88    55
1939/01/07    PA    73    80    39    38    57
1939/01/07    RM    73    24    4    39    22
1939/01/07    TO    19    43    10    31    27
1939/01/07    VE    9    43    61    14    75
1939/01/14    BA    18    77    33    62    19
1939/01/14    FI    31    47    12    7    80

fino a fine archivio... (credo che i campi siano spazi o tabulazioni, diciamo che cosi Split(" ";) mi mostrava l'intera riga mentre così Split(), controllando con il debug mi riempiva correttamente il vettore con 7 campi (Data, Ruota, Estratto1, Estratto2, Estratto3, Estratto4, Estratto5). Solo che DataSet va aggiunta una Chiave Primaria(PK) quindi i campi diventano 8, forse anche per quello che mi da errore perchè tenta di salvare la Data nel PK e non trovando il campo adatto mi da errore di conversione del tipo di dato (spero di avere scritto giusto).

Ma le altre?
sono cooncatenate?
sono separate in altre linee?
c'è qualche simbolo per indentificare una nuova linea?


Spiegato piu sopra, grazie anche se piccolo un aiuto e sempre un aiuto e sono qui per imparare acettando anche che il mio codice faccia completamente schifo, un imput in più per andare avanti a fare di meglio.
Ultima modifica effettuata da Giacos71 28/10/21 11:30
aaa
28/10/21 11:45
Carlo
Vedo che ti mancano le basi, se perseveri però riuscirai.
Condivido le perplessità di nessuno e Thejuster

Il tuo codice funzionante ma migliorabile:
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'Nuovo DataTable Estrazioni
        Dim Archivio As DataTable = New DataTable("Estrazioni")
        'Crea la Chiave Primaria ID
        Dim ID_PK As DataColumn = Archivio.Columns.Add("ID", GetType(Int32))
        ID_PK.AllowDBNull = False
        ID_PK.Unique = True
        'Crea le colonne appropriate
        Archivio.Columns.Add("Data", GetType(Date))
        Archivio.Columns.Add("Ruota", GetType(String))
        Archivio.Columns.Add("Estratto1", GetType(Double))
        Archivio.Columns.Add("Estratto2", GetType(Double))
        Archivio.Columns.Add("Estratto3", GetType(Double))
        Archivio.Columns.Add("Estratto4", GetType(Double))
        Archivio.Columns.Add("Estratto5", GetType(Double))

        ' Carica il file storico.txt della Lottomatica e legge tutte le righe
        Dim RecordArchivioTXT As New List(Of String) ' lista che conterrà tutte le righe
        Try
            ' Il file da leggere è C:\storico71-00_B.txt
            ' Se il file non esiste, verrà comunicato nell'eccezione.
            Dim FileName As String = "C:\storico71-00_B.txt"
            ' tutto il file nella lista riga per riga
            RecordArchivioTXT = System.IO.File.ReadAllLines(FileName).ToList

        Catch ex As Exception
            ' Mostro l'errore se la sub genera un errore.
            MessageBox.Show("Error message: " & ex.Message)
        End Try

        ' leggo riga per riga la lista e inserisco i valori divisi in Archivio
        For riga = 0 To RecordArchivioTXT.Count() - 1
            Dim str As String = RecordArchivioTXT(riga) ' in str una riga della lista caricata
            str = str.Replace("    ", " ") ' sostituisco i 4 spazi con uno solo, se invece hai le tabulazioni non serve
            Dim strArr() As String = str.Split() ' in strArr i valori divisi dallo spazio, o dalla tabulazione
            'Crea un nuova riga nella variabile Archivio DataTable
            Dim RecordArchivio As DataRow = Archivio.NewRow()
            RecordArchivio(0) = riga ' ID
            RecordArchivio(1) = Convert.ToDateTime(strArr(0)) ' data nell'archivio txt
            RecordArchivio(2) = Convert.ToString(strArr(1)) ' ruota
            RecordArchivio(3) = Convert.ToDouble(strArr(2)) ' 1° estratto
            RecordArchivio(4) = Convert.ToDouble(strArr(3)) ' 2° estratto
            RecordArchivio(5) = Convert.ToDouble(strArr(4)) ' 3° estratto
            RecordArchivio(6) = Convert.ToDouble(strArr(5)) ' 4° estratto
            RecordArchivio(7) = Convert.ToDouble(strArr(6)) ' 5° estratto
            Archivio.Rows.Add(RecordArchivio)
        Next

        DataGridView1.DataSource = Archivio
    End Sub


leggi bene i commenti.

1939/01/07 BA 58 22 47 49 69
1939/01/07 FI 27 57 81 43 61
1939/01/07 MI 40 38 57 67 7
1939/01/07 NA 85 44 48 88 55
1939/01/07 PA 73 80 39 38 57
1939/01/07 RM 73 24 4 39 22
1939/01/07 TO 19 43 10 31 27
1939/01/07 VE 9 43 61 14 75
1939/01/14 BA 18 77 33 62 19
1939/01/14 FI 31 47 12 7 80

con 4 spazi tra i campi...
non ci sono controlli se il file contiene righe vuote, anche alla fine, o dati incongrui avrai un errore
Ultima modifica effettuata da Carlo 28/10/21 12:19
in programmazione tutto è permesso
28/10/21 12:15
Thejuster
Rispondo a Giacos71

Si non lo nego che ho postato un post simile in tale forum, ma a me sembra che prima di dare aiuto trmite non so quale metodo viene fatta una ricerca se l'utente a messo lo stesso post in altro forum!
Tengo a precisare che non me la sono presa per l'osservazione, ma volevo solo sapere se è un reato chiedere aiuto in più punti oppure no. Se lo chiedo è perchè ne ho bisogno e ritengo il forum (o anche più di uno) un punto di riferimento.


Questo è una violazione del regolamento del forum.

Non è un reato frequentare più forum. Ma il problema nasce in se per il Cross-Posting.

Ovvero postare lo stesso problema in più forum.
Avere più punti di riferimento e bene. Ma che non trattano dello stesso argomento anche perché non ha senso chiedere
su più forum la soluzione di un problema.

Regolamento Generale ( Punto 8° )
pierotofy.it/pages/extras/forum/9/3839-regolamento/


Si vorrei mettere poi tutto in un db anche se forse c'è qualcosa di dell'estensione .mdb, cmq ho sempre visto consigliato di utilizzare un dataset per lavorare con i dati in memoria e poi ne fa l'uso che più ne aggrada.


Anche se forse c'è qualcosa dell'estensione .mdb?
Che intendi per mdb? MDB per me non significa nulla. e solo un estensione che posso crearla anche io.
Se intendi qualcosa tipo access...Credo che sia assurdo anche pensare di fare un cosa del genere.
Anche perché i file di access sono facilmente modificabili e non sicuri da fonti esterne.
Meglio creare un proprio database o usare Sqlite se proprio vuoi risparmiare del tempo.



Probabilmente il mio errore e nel ciclo for perchè splitto la riga, ma poi per splittare la riga mi perdo, questo step andrebbe fatto riga x riga fino alla fine del file, ammetto le mie deficenze in materia.


Dunque sei hai capito l'errore dove sta.
Leggi la guida di totem sui cicli e sulla lettura dei file.
Magari basta cercare anche su google e semplicissimo.

hwupgrade.it/forum/…



mire.forumfree.it/ - Mire Engine
C# UI Designer
28/10/21 13:06
Giacos71
Postato originariamente da Carlo:

Vedo che ti mancano le basi, se perseveri però riuscirai.
Condivido le perplessità di nessuno e Thejuster

Il tuo codice funzionante ma migliorabile:
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'Nuovo DataTable Estrazioni
        Dim Archivio As DataTable = New DataTable("Estrazioni")
        'Crea la Chiave Primaria ID
        Dim ID_PK As DataColumn = Archivio.Columns.Add("ID", GetType(Int32))
        ID_PK.AllowDBNull = False
        ID_PK.Unique = True
        'Crea le colonne appropriate
        Archivio.Columns.Add("Data", GetType(Date))
        Archivio.Columns.Add("Ruota", GetType(String))
        Archivio.Columns.Add("Estratto1", GetType(Double))
        Archivio.Columns.Add("Estratto2", GetType(Double))
        Archivio.Columns.Add("Estratto3", GetType(Double))
        Archivio.Columns.Add("Estratto4", GetType(Double))
        Archivio.Columns.Add("Estratto5", GetType(Double))

        ' Carica il file storico.txt della Lottomatica e legge tutte le righe
        Dim RecordArchivioTXT As New List(Of String) ' lista che conterrà tutte le righe
        Try
            ' Il file da leggere è C:\storico71-00_B.txt
            ' Se il file non esiste, verrà comunicato nell'eccezione.
            Dim FileName As String = "C:\storico71-00_B.txt"
            ' tutto il file nella lista riga per riga
            RecordArchivioTXT = System.IO.File.ReadAllLines(FileName).ToList

        Catch ex As Exception
            ' Mostro l'errore se la sub genera un errore.
            MessageBox.Show("Error message: " & ex.Message)
        End Try

        ' leggo riga per riga la lista e inserisco i valori divisi in Archivio
        For riga = 0 To RecordArchivioTXT.Count() - 1
            Dim str As String = RecordArchivioTXT(riga) ' in str una riga della lista caricata
            str = str.Replace("    ", " ") ' sostituisco i 4 spazi con uno solo
            Dim strArr() As String = str.Split() ' in strArr i valori divisi dallo spazio
            'Crea un nuova riga nella variabile Archivio DataTable
            Dim RecordArchivio As DataRow = Archivio.NewRow()
            RecordArchivio(0) = riga ' ID
            RecordArchivio(1) = Convert.ToDateTime(strArr(0)) ' data nell'archivio txt
            RecordArchivio(2) = Convert.ToString(strArr(1)) ' ruota
            RecordArchivio(3) = Convert.ToDouble(strArr(2)) ' 1° estratto
            RecordArchivio(4) = Convert.ToDouble(strArr(3)) ' 2° estratto
            RecordArchivio(5) = Convert.ToDouble(strArr(4)) ' 3° estratto
            RecordArchivio(6) = Convert.ToDouble(strArr(5)) ' 4° estratto
            RecordArchivio(7) = Convert.ToDouble(strArr(6)) ' 5° estratto
            Archivio.Rows.Add(RecordArchivio)
        Next

        DataGridView1.DataSource = Archivio
    End Sub


leggi bene i commenti.

1939/01/07 BA 58 22 47 49 69
1939/01/07 FI 27 57 81 43 61
1939/01/07 MI 40 38 57 67 7
1939/01/07 NA 85 44 48 88 55
1939/01/07 PA 73 80 39 38 57
1939/01/07 RM 73 24 4 39 22
1939/01/07 TO 19 43 10 31 27
1939/01/07 VE 9 43 61 14 75
1939/01/14 BA 18 77 33 62 19
1939/01/14 FI 31 47 12 7 80

con 4 spazi tra i campi...
non ci sono controlli se il file contiene righe vuote, anche alla fine, o dati incongrui avrai un errore


Innanzi tutto grazie ho provato il codice e funziona alla perfezione, però non è nemmeno giusto avere la pappa pronta, volevo anche capire cosa avevo fatto giusto e cosa di sbagliato.

Due cosè che ho notato che hai utlilzzato una lista per memorizzare le righe e poi con codice ben commentato hai ridotto lo spazio per renderlo uguale e probabilmente per la questione dei possibili errori di cui mi parlavi giusto?

Altra cosa vedo che sei riuscito ad ad inserire la chiave ID senza che si intrecciasero i dati e senza dare errore invece io ci stavo sbattendo la testa.

Ho alcune cose da chiedere: mi si consiglia di creare delle routine riutilizzabili da inserire in un modulo e richiamarle successivamente piuttosto che mettere tutto il codice in un button?

Quale consigli mi puoi dare per migliorare il mio codice?

Successivamente pensavo di memorizzare i dati in un database ma dovrei scegliere quale meglio (ho sempre utilizzato un .mdb). In un vecchio DB avevo tutti i record su unica riga Data, Num concorso, 50 estratti qui invece le date sono ripetute x11, quindi penso ci dovrà essere un lavoro di normalizzazione con relative relazioni e cambio struttura codice (spero di non essere andato OFF TOPIC).
Ultima modifica effettuata da Giacos71 28/10/21 13:07
aaa