Scrivere e leggere una griglia da un file ? ? ?

venerdì 20 marzo 2009 - 15.16

willy_80 Profilo | Senior Member

Ciao a tutti,
ho una grande griglia di dati es.:10000 X 10000.
Chiaramente non posso caricare i dati in una grid contenuta nel form quindi ho pensato di salvare il tutto in un file.
Ispirandomi alla battaglia navale ho scritto il valore delle celle tra le virgole.

Es:

01,02,03,04,05,06,07,08,09.....
11,12,13,14,15,16,17,18,19.....
21,22,23,24,25,26,27,28,29.....
31,32,33,34,35,36,37,38,39.....
....

Ottenendo quindiche ogni riga di file corrisponde ad una riga di "griglia" e ogni (,) divide una colonna dall'altra.
[ Alla riga 3 colonna 5 corrisponde il valore 25 ]
Finquà spero di essere stato abbastanza chiaro.

Il problema che ho è riuscire ad immettere e leggere i dati perchè so esattamente in anticipo quante righe e colonne dovrà avere il mio file ma i valori mi vengono forniti a caso.
Mi hanno consigliato di usare il sistema Random di apertura dei file in modo da puntare direttamente sulla riga che mi interessa senza doverle scorrere tutte col comando lineinput, caricarmi la riga separarne i valori col comando split inserire quello che mi interessa e riscrivere la riga modificata.
Ho dato un occhiata alla guida in linea ma non sono riuscito a venirne fuori.
Mi sapete aiutare?
Grazie

luigidibiasi Profilo | Guru

>Il problema che ho è riuscire ad immettere e leggere i dati perchè
>so esattamente in anticipo quante righe e colonne dovrà avere
>il mio file ma i valori mi vengono forniti a caso.
>Mi hanno consigliato di usare il sistema Random di apertura dei
>file in modo da puntare direttamente sulla riga che mi interessa
>senza doverle scorrere tutte col comando lineinput, caricarmi
>la riga separarne i valori col comando split inserire quello
>che mi interessa e riscrivere la riga modificata.

scusami.. parli di leggere la riga, modificarla e riscriverla nel file o devi scriverla in una datagridview?

Nel primo caso sai quanto può essere lunga un riga?


Per la lettura in modalità random puoi fare così:


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


>Ho dato un occhiata alla guida in linea ma non sono riuscito
>a venirne fuori.
>Mi sapete aiutare?
>Grazie

Luigi Di Biasi
http://blogs.dotnethell.it/luigidibiasi/

willy_80 Profilo | Senior Member

La cosa mi diventa un po incasinata perchè non so quanto lunga sia la mia riga ma so quante "celle" contiene.

normalmente con la modalita input faccio così:

Dim Lettura As String
Dim Valori (0 To 10000) As Decimal

Fileopen (1,"C:\FileGrid.txt",OpenMode.Input)
Lettura = Lineinput (1)
Valori = Lettura.Split (",")
FileClose (1)

in questo modo nella matrice Valori ottengo tutti i valori delle celle, però se devo leggere la riga 5600 devo ciclare n-1 volte il comando lineinput inutilmente e poi quando è ora di inserire la stessa stringa nella posizione di partenza è un casino ancora maggiore......

babbubba Profilo | Senior Member

Scusami... devi per forza usare un file di testo?

io farei un file xml... lo caricherei in un Datatset che userei come source per la griglia.
Quando modifico la griglia basta solo che mi ricordi di salvare le modifiche del dataset sul file xml.

Se è questo quello che vuoi fare bastano poche righe di codice.

Ciao
Babbubba
www.babbubba.tk

Chiedere è curiosità ... rispondere è educazione.

willy_80 Profilo | Senior Member

Ciao l'idea potrebbe essere ottima il mio problema, oltre a non aver mai usato file xml e dataset è che la mia "griglia" potrebbe contenere un massimo di 30000 righe per 20000 colonne, di conseguenza credo che caricare in una griglia un tale volume di dati sia impossibile o sbaglio?

babbubba Profilo | Senior Member

Nulla è impossibile :-). Bisogna vedere quanto performante sia... quello si!
Cque lavorare con dataset e xml è quasi banale...

Esempio:
'creo un dataset ed una tabella "prova" con 5 colonne....
dim ds as new dataset("Mio Dataset") ' creo il dataset DS
ds.tables.add("prova") 'aggiungo la tabella prova al dataset
ds.tables("prova").columns.add("colonna1") ' aggiungo la colonna "colonna1" alla tabella prova
...
ds.tables("prova").columns.add("colonna5")

'ora ho fatto la struttura...
'aggiungo anche una riga...

ds.tables("prova").rows.add("ValoreColonna1", ... , "ValoreColonna5")

'accetto le modifiche
ds.acceptchange

'salvo il dataset in un file xml
ds.writeXml("C:\file.xml") ' genero il file xml file.xml con i dati del dataset...
basta che gli dai un'occhiata per capire come funziona xml....

per leggere i dati da un file
ds.readXml("C:\file.xml")

Per accedere poi alla riga 100 e alla colonna 9 basta:
dim valore as object = ds.tables("prova").rows(100).items(8) ' perche 8? Perche le colonne partono da 0 quindi la 9 sarà l'elemento 8.

Sono stato abbastanza chiaro?

Ciao






Babbubba
www.babbubba.tk

Chiedere è curiosità ... rispondere è educazione.

willy_80 Profilo | Senior Member

Ho fatto una prova con una manciata di valori e funziona tutto alla grande, ora provo a sbattergli dentro il pacco di dati che ho e ti faccio sapere.
Intanto grazie, ci risentiamo...

willy_80 Profilo | Senior Member

Ho provato ad applicare il tuo esempio al mio progetto in questo modo:

============================================================
Dim ds As New DataSet("Dataset")
Dim RigaAppoggio As String = ""

'Creo una riga contenente valori nulli
For i = 1 To NumColonne
RigaAppoggio = RigaAppoggio & ","
Next

ds.Tables.Add("prova") 'aggiungo la tabella prova al dataset

'Aggiungo tutte le colonne
Dim NomeColonna As String
For i = 0 To NumColonne
NomeColonna = (i).ToString
ds.Tables("prova").Columns.Add(NomeColonna) ' aggiungo la colonna alla tabella prova
Next

'Aggiungo tutte le righe
For i = 0 To NumRighe
ds.Tables("prova").Rows.Add(RigaAppoggio)
Next

Dim valore As Object
Dim Riga As Integer
Dim Colonna As Integer

'Apertura dei file
FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input)

'Estrazione dei valori di riga colonna e valore dal file
Lettura = LineInput(1)
Quote = Lettura.Split(",")
Riga = Quote(1) * 10
Colonna = Quote(0) * 10

'Scrivo nell'item che mi interessa il valore
valore = Quote(2).ToString
ds.Tables("prova").Rows(Riga).Item(Colonna) = valore

FileClose(1)

'accetto le modifiche
ds.AcceptChanges()

'salvo il dataset in un file xml
ds.WriteXml("C:\file.xml") ' genero il file xml file.xml con i dati del dataset...

============================================================

Purtroppo non funziona ma scommetto che l'errore è nel tentativo di immissione dei dati.
Nel file xml mi ritrovo solo le righe di appoggio.
Mi sai indicare dove sbaglio????
Mi sa che se riesco ad ottimizzare questa cosa probabilmente risolvo tutti i miei problemi.

babbubba Profilo | Senior Member

Io se posso ti aiuto volentieri... ma se non mi dici che errore ti da? :-)

Da me ho provato il tuo codice e l'unico problema che mi da è nella riga:
ds.Tables("prova").Rows(Riga).Item(Colonna) = valore
perchè arrivo alla riga 100 che non ho inizializzato e mi da , giustamente, errore.

Postami l'errore e vediamo di risolvere
Bye
Babbubba
www.babbubba.tk

Chiedere è curiosità ... rispondere è educazione.

babbubba Profilo | Senior Member

Scusa! Ho capito adesso cosa volevi dire :-) ...

Il primo errore è questo:
ds.Tables("prova").Rows.Add(RigaAppoggio)

in parole povere cosi inserisci nella prima colonna della riga una sfilza di virgole, quante sono le tue colonne e non tutte le colonne vuote.
Devi usare un array oppure popolare le righe in due cicli uno delle righe e uno,interno delle colonne....
io farei cosi:

ds.Tables.Add("prova") 'aggiungo la tabella prova al dataset

'Aggiungo tutte le colonne
Dim NomeColonna As String
For i = 0 To colonne
NomeColonna = (i).ToString
ds.Tables("prova").Columns.Add("Colonna" & NomeColonna) ' in xml le colonne non devono iniziare con un numero....
Next

'Aggiungo tutte le righe
For i = 0 To righe '10 per prova
Dim rigadiappoggio As DataRow = ds.Tables("prova").NewRow()
for c as integer = 0 to colonne
rigadiappoggio.Item(c) = ""
Next c
Next i


una volta risolto questo proviamo a vedere se hai ancora problemi
Bye

Babbubba
www.babbubba.tk

Chiedere è curiosità ... rispondere è educazione.

willy_80 Profilo | Senior Member

Ciao ho provato sia copiando il tuo codice sia modificandolo cosi:

rigadiappoggio.Item(c) = "A"

ma il risultato che ottengo è sempre lo stesso:

<?xml version="1.0" standalone="yes"?>
<Dataset />

e quando tento di accedere al file mi dice che non esiste la riga o la colonna...

Ti spiego come ho capito io il funzionamento e come ho pensato di procedere così mi dici se e dove sbaglio:
1. Ho un file che contiene un gran numero di punti nello spazio quindi X,Y,Z
2. Voglio creare un recordset, associando alla X la colonna, alla Y la riga, e al valore del record il valore di Z
3. I punti li leggo dal file ma sono in ordine sparso
4. Calcolo la X massima e la Y massima ottenendo il num di colonne e di righe da creare
QUINDI:
5. Creo il recordset e una tabella
6. Creo tutte le colonne con nome "Colonna" & (valore di X)
7. Creo tutte le righe inserendovi ad ognuna una matrice contenente X valori nulli
8. Apro il mio file, lo leggo e inserisco i valori nei record
9. Salvo il recordset

babbubba Profilo | Senior Member

E' vero che non funziona! Ma perche sono stupido io!
Scusa...

'Aggiungo tutte le righe
For r As Integer = 1 To righe
Dim rigadiappoggio As DataRow = ds.Tables("prova").NewRow()
For c As Integer = 0 To colonne -1 'se nn metti il meno uno aggiungi una colonna di troppo visto che parti dallo zero
rigadiappoggio.Item(c) = ""
Next
ds.Tables("prova").Rows.Add(RigaAppoggio) 'Ecco cosa mancava :-)
Next

Provala e dimmi...

Babbubba
www.babbubba.tk

Chiedere è curiosità ... rispondere è educazione.

willy_80 Profilo | Senior Member

OK smanettando lo avevo gia intuito e aggiunto.
Ora funge.
Dopo aver creato il dataset diciamo che devo modificare il valore del record nella riga 6 colonna 3.
Come posso fare???

babbubba Profilo | Senior Member

... dopo aver creato il dataset diciamo che devo modificare il valore del record nella riga 6 colonna 3 ...

Ecco qui:

ds.Tables("prova").Rows(6).item(2) = "nuovo valore"

In questo modo modifichi il dataset con il quale puoi lavorare molto piu velocemente che su un file visto che è in memoria.
Una volta finito di cambiare i valori ... accetti le modifice e salvi.

ds.acceptchange()
ds.writeXml("file.xml")




Babbubba
www.babbubba.tk

Chiedere è curiosità ... rispondere è educazione.

willy_80 Profilo | Senior Member

Ciao io ci avevo gia provato in questo modo ma quando lancio il debug
mi genera un errore:

Dim ds As New DataSet("Dataset")
ds.Tables("prova").Rows(6).item(2) = "nuovo valore"
ds.AcceptChanges()
ds.writeXml("file.xml")

riferito alla seconda riga:
"Riferimento a un oggetto non impostato su un'istanza di oggetto."

il codice che ho aggiunto è in una routine dedicata alla modifica dei dati

willy_80 Profilo | Senior Member

Scusa ma mi sono accorto solo ora della cavolata che stavo facendo.....

non posso scrivere su un file se non l'ho ancora aperto....

babbubba Profilo | Senior Member

Piu che altro... per aggiungere il valore cosi bisogna che quella riga e quella colonna siano già state riempite. Aprendo un file xml pieno oppure popolandolo con il codice che ti avevo postato prima.
Babbubba
www.babbubba.tk

Chiedere è curiosità ... rispondere è educazione.

willy_80 Profilo | Senior Member

Se devo aprire un file xml devo usare il comando :

ds.ReadXml("C:\file.xml")

'==========================================

ho provato a crearne uno con 3380 colonne e 4740 righe.

quando il debugg esegue la riga e si pianta mi sai dire il perchè

babbubba Profilo | Senior Member

Ma si pianta senza darti errore?

Hai provato ad aspettare perche magari il file è un po grande?

Il file xml che gli fai aprire è già popolato?

Babbubba
www.babbubba.tk

Chiedere è curiosità ... rispondere è educazione.

willy_80 Profilo | Senior Member

si il file è popolato , non da errori ma rimane fermo sul comando

babbubba Profilo | Senior Member

Onetsamente non mi è mai successa una roba simile...

Se sbaglio qualcosa va in loop quando ciclo un popolamento ma mai successo quando leggo dal file.

Non saprei cosa dirti...
Io riproverei popolando un nuovo xml da 0

Babbubba
www.babbubba.tk

Chiedere è curiosità ... rispondere è educazione.

willy_80 Profilo | Senior Member

Lasciandolo andare è riuscito a leggere il file in 24 secondi

willy_80 Profilo | Senior Member

Scusa mi correggo 2 minuti e 24 secondi

willy_80 Profilo | Senior Member

Facendo tutte le prove il sistema funziona bene ma anche in questo caso il sistema diventa molto lento.
Mi sa che mi conviene tornare al mio caro file di testo con separatore di elenco.
Mi sapresti dire come fare per aprire un file di testo e leggere un preciso numero di riga senza dover scorrere tutte quelle precedenti ?

babbubba Profilo | Senior Member

Perdonami....
ma dopo che hai letto i dati e li tieni nel dataset... non puoi lavorare su quello?

Non devi salvare il file xml ogni volta che lo modifichi basta farlo prima di uscire dal programma.
Leggere direttamente dal file di testo ogni volta che vuoi prendere un dato è sucuramente piu lento che lavorare con un dataset in memoria.

Prova a spiegarci meglio cosa vuoi fare con le coordinate caricate... magari la soluzione è più vicina di quello che sembra.

Ciao

PS: Che io sappia l'accesso ai file avviene tramite uno stream che è sequenziale... cioe parte dall'inizio e si sposta fino alla fine. Anche in quel caso dovresti creare un dataset che si popola con i dati del file ma nn pensare di riuscire a lavorare direttamente sul file.

Babbubba
www.babbubba.tk

Chiedere è curiosità ... rispondere è educazione.

willy_80 Profilo | Senior Member

Fai conto di disegnare un oggetto 3d usando questi punti.
Io ho varie funzioni che ne editano delle parti selezionate dall'utente, il che vuol dire cancellare i punti , fare la media dei valori , aumentare e diminuire il valore di z ecc...
Tutto questo però gestendo più file infatti si può aprire una finestra col file A una col file B una col C ecc...
Di conseguenza dovrei tenere in memoria i dati di vari recordset piantando il pc....

babbubba Profilo | Senior Member

...mmmm...
non so che dirti.
Cque ripeto che secondo me è il caso che fai un'analisi per valutare una soluzione alternativa al leggere e scrivere sul file in continuazione.

Ciao e buon lavoro.


Babbubba
www.babbubba.tk

Chiedere è curiosità ... rispondere è educazione.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5