Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    27

    [vb2010]adattamento dati da stringa

    Salve a tutti,
    sono alle prime armi e non so come fare per estrarre solo le informazioni che mi servono da una riga di testo, dove ogni parola è separata dal carattere pipe.

    In pratica mi trovo in questa situazione; testo di esempio:
    Piero|Paolo|12|tre|sedia|libro|12/09/2011|123456|Giovanni|giornali abc|sereno|Luca

    Come si può notare le parole sono separate dal pipe. Io però so che mi servono le parole che sono sempre ad esempio nella posizione 1,2,7,8,9,12 perchè ricavate da un database.
    Vorrei quindi ottenere : Piero|Paolo|12/09/2011|123456|Giovanni|Luca

    L'adattamento inoltre andrebbe ripetuto per tutte le righe del file di testo.

    Potete spiegarmi come fare, magari facendomi anche un esempio pratico.
    Grazie infinite

  2. #2
    Usa il metodo Split(), metodo che accetta un parametro, il separatore, nel tuo caso il carattere |

    Poniamo caso ché: tu hai, come nel tuo esempio la stringa pippo|pluto|giovanni, che devi separare, in questo caso in più elementi, ogni volta che è presente il carattere |, basta fare in questo modo:

    codice:
    Dim str As String = "pippo|pluto|giovanni"
    Dim spt() As String = str.Split("|")
    Ora spt è un'array contenente tutti gli elementi della stringa, separati dal carattere |

    L'unico problema ora sarebbe che: se una stringa contenesse a sua volta il valore |, venisse considerato come separatore.

    Se pensi che possa capitare questo devi proprio cambiare metodo di memorizzazione dei dati che memorizzi nel database:

    Ad esempio, ti può tornare utile, creare la stringa come array:

    codice:
    Dim str() As String = ("pippo", "pluto", "giovanni")
    E memorizzarla nel database, ovviamente non come array, anche perché i database non supportano le array, ma prima di farlo dovresti serializzarla, convertendola da array a stringa, cosi facendo la puoi memorizzare nel database, poi, dopo averla recuperata ti basta riconvertire da stringa a array, e il gioco è fatto.

    Bhe.. io ti ho detto come fare, ma ti ho dato anche una soluzione che credo di migliori le cose, ma dovresti vedere come applicarla, purtroppo io so come farla, ma non in vb.net.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    27
    Grazie dragon88, il tuo suggerimento è buono. Però mi sono spiegato male.
    Io devo realizzare come prodotto finale un file di testo (non devo inserire i dati in un database).

    Quello che sono riuscito a fare fin'ora è caricare il mio file di testo, così:
    codice:
    Sub Main() 
    'legge il file txt e lo mostra a video 
    Dim fileReader As String 
    fileReader = My.Computer.FileSystem.ReadAllText("C://archivio/test.txt") 
    MsgBox(fileReader) End Sub
    Ho provato a mettere
    codice:
    Dim spt() As String = str.Split("|")
    ma ricevo come risposta: Errore 1 Argomento non specificato per il parametro 'Number' di 'Public Function Str(Number As Object) As String'.

    In pratica devo estrarre parti del testo, come dicevo nel primo post. Alla fine mi va bene salvare nuovamente un file di testo, anche in txt. Spero di aver chiarito meglio il mio bisogno. Grazie ancora dragon88 per la tua disponibilità.

  4. #4
    Ah, credo di aver capito.

    Intanto dovresti leggere il file riga per riga, e potresti mettere ogni riga in una collection, non ho ben capito se lo sai fare, ma potresti fare cosi:

    codice:
    Dim File as System.IO.File
    Dim Read as System.IO.StreamReader
    Dim lines as ArrayList
    
    Try
        Read = File.OpenText(indirizzo_file)
    
        While oRead.Peek <> -1
            lines.add(Read.ReadLine())
        End While
    
        Read.Close() 
    Catch  ex As Exception
        MsgBox("Errore.");
    End Try
    Dopo di che potresti recuperare gli elementi nella collection e per ogni elemento potresti fare quello che ho fatto io con lo script, cosa che mi pare molto strano che di da errore, se mai potresti fare una ricerca sulla funzione su google.

    Dopo di che, te ai detto che ti servono solamente alcuni elementi, indici, della riga, per fare questo potresti cancellare dall'array, contenente la linea splittata gli indice che non ti servono, purtroppo ora non ricordo che metodo si usa.

    In alternativa, se l'array ti serve, potresti creare una nuova array, contenenti solo gli indici dell'array splittata che ti servono, alla fine puoi unire in tutto con il metodo join():

    http://www.ezineasp.net/post/VB-Net-...-function.aspx

    E riscrivi il contenuto all'interno del file, che penso debbia sovrascrivere, se vuoi che i vecchi valori delle righe vengono sostituite con i nuovi appena creato.

    Tutto questo lo dovresti fare nel ciclo di lettura di ogni elemento della collection.

    Era questo che intendevi sapere?

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    27
    Si, stavolta hai capito bene.
    Però nel tuo codice ho dovuto fare alcune correzioni.
    Rimane ancora 1 errore che riguarda il File.OpenText dove segnala il seguente avviso:
    Accesso di membro condiviso, membro costante, membro enum o tipo annidato tramite un'istanza; l'espressione di qualificazione non verrà valutata.

    Come si corregge ?

    Intanto avevo creato un listato per estrarre dati tramite un array, che ti metto sotto.
    Però funziona solo per la prima riga, con la tua parte speravo di completare il ciclo.
    Grazie di tutto. Ciao
    codice:
    'parte del codice di dragon88 che ho messo all'inizio
    
    Dim File As System.IO.File 
    Dim Read As System.IO.StreamReader 
    Dim lines As ArrayList 
    Try 
    Read = File.OpenText("C://doc/foglio.txt") <-- errore
    While Read.Peek <> -1 
    lines.Add(Read.ReadLine()) 
    End While 
    
    Read.Close() 
    Catch ex As Exception MsgBox("Errore.") 
    End Try 
    
    ' parte funzionante di estrazione dati, ma solo per la prima riga del listato del testo
    
    Dim fileReader As String fileReader = My.Computer.FileSystem.ReadAllText("C://doc/foglio.txt") 
    Dim myArray() As String 
    myArray = Split(fileReader, "|") 
    Dim Str As String = "|" 
    Console.WriteLine(myArray(0) & Str & myArray(5) & Str & myArray(6) & Str & myArray(10) & Str & myArray(12) & Str & myArray(42)) 
    Console.ReadKey()

  6. #6
    Inanzi tutti scusa, ma quel codice non l'ho avevo provato, ed è da molto tempo che non uso quelle classi, e purtroppo o fatto altri errori di confusione, modifica il codice per leggere ogni linea del file cosi:

    codice:
            Dim lines As New ArrayList
    
            Try
                Dim reader As StreamReader = File.OpenText("C:/foglio.txt")
    
                While reader.Peek() <> -1
                    lines.Add(reader.ReadLine)
                End While
    
                reader.Close()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
    L'errori che riporti credo sia dovuto al fatto che non hai importato, sopra a tutto il codice, alla classe principale System.Io.

    Cmq, c'è ancora un'eccezione che non so cosa sia, cmq dovrebbe essere solo quello il problema ora.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    27
    Figurati, grazie a te per la tua pazienza.
    Ho corretto solo questa istruzione:

    codice:
    Dim reader As IO.StreamReader = IO.File.OpenText("C:/foglio.txt")
    Così non sono segnalati errori, ma a video mi riporta solo il risultato della prima riga come prima, senza l'aggiunta del tuo pezzo.

    Forse bisognerebbe creare un ciclo per riscrivere tutti i dati ?

    Allora avevo pensato di far contare gli elementi dell'arraylist, come riportato qui, da usare come contatore delle righe da mostrare. Purtroppo sono troppo scarso e non ci sono riuscito.

    Anche se il mio obiettivo finale è ricreare un file di testo in txt e non una visualizzazione a video. Grazie ancora

  8. #8
    Guarda, il problema del mio codice non è quella riga, lo provato personalmente.

    Non so, prova a sostituire l'istruzione dentro il while con questa:

    codice:
    MsgBox(reader.readLine());
    Funziona tutto bene, da quello che ho visto io mi legge tutte le righe, poi non so a te, credo che l'eccezione sia prodotta dall'istruzione dentro il while, e no da quella che hai modificato te.

    Per il resto del codice credo che vada bene il procedimento che ti ho scritto nella mia seconda risposta.

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    27
    Grande dragon88, così funziona.

    Adesso devo usare la funzione split per separare le parole.
    Ho provato così:
    Dim spt() As String = str.Split("|")

    mi dice che str è un errore, cioè "argomento non specificato"

    Ho provato a sostituirlo con lines, ma anche così non va.
    Cosa devo mettere ? Ciao e grazie ancora

  10. #10
    Il codice è corretto, ma str cos'è nel tuo codice?

    Cmq, se sei riuscito a mettere ogni riga all'interno della collection liness io proseguirei cosi:

    codice:
    For i As Integer = 0 To lines.Count - 1
        Dim str() As String = lines.item(i).split("|");
        Dim final_str As String
    
        final_str = str(0) + "|" + str(7) + "|" + str(1)
    
        ' Qui dovresti scrivere nel file, o sovrascrivere il file esistente, o su un nuovo file, la variabile    final_str.
    Next
    Purtroppo il codice non lo provato, ma all'incirca dovresti fare questo, almeno è quello che vuoi ottenere te, anche se per farti un'esempio la stringa in modo diverso da quello che vuoi te.

    Ah, ovviamente ho fatto il tutto senza metodo Join, anche se te lo avevo consigliato precedentemente.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.