Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - vb.2008. modificare il contenuto di un file delimitato con
Forum - C# / VB.NET - vb.2008. modificare il contenuto di un file delimitato con ";"

Avatar
shpalman62 (Normal User)
Newbie


Messaggi: 19
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 16:21
Venerdì, 24/04/2009
Salve a tutti. Ho cercato nei topic ma non ho trovato nulla. Premetto che sono una schiappa totale. Problema: ho un file in formato txt contenente 1000 records ognuno composto da 22 campi tutti separati da ";". Ogni record è su una riga. Il primo campo è costituito da un codice. Ho un secondo file in formato txt che contiene x record formati da 40 campi. Devo verificare se ogni ogni codice di ogni record del 2° file sia presente sul 1° file. Se è presente allora devo modificare il valore del 22° campo del 1° file col valore del 16° campo del 2° file. Il file modificato deve essere salvato. Non so se mi sono spegato bene. Fate conto che abbia un listino prezzi e solo alcuni articoli debbono cambiare il prezzo con quello presente su di un'altro file. Grazie a tutti e saluti.

PM Quote
Avatar
punkettone90 (Member)
Expert


Messaggi: 279
Iscritto: 16/05/2007

Segnala al moderatore
Postato alle 17:16
Venerdì, 24/04/2009
si può fare ma quello che mi chiedo è: vale la pena usare come database un file txt?
visto che i record sono molti e pure i campi perchè non usi un database come mysql o access?

tempo fa mi sono trovato a dover fare anch'io un lavoro del genere e l'idea di potermi appoggiare a delle query mi ha aiutato moltissimo e mi ha fatto risparmiare un sacco di codice.

Io (e quasi tutti penso) ti consiglio di usare un database, dopo scegli tu...

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 17:17
Venerdì, 24/04/2009
:-| emh... sì :rofl:
Per leggere un file testuale, si usa StreamReader, o uno dei metodi statici di IO.File: ad esempio IO.File.ReadAllText("file") restituisce una stringa contenente tutto il file; IO.File.ReadAllLines("file") restituisce un array di stringhe dove ogni stringa rappresenta una riga del file. Ti consiglio di usare uno StreamReader, così eviti di memorizzare i 1000 record nella RAM.
Per spezzare la stringa sui ";", ossia ottenere ogni singolo campo separato dai punti e virgola, si usa String.Split(";"), richiamato dalla stringa che vuoi spezzare (in questo caso la riga del file appena letta).
Per scrivere sul file si usa StreamWriter.
Per scrivere un codice così ci metterei un po' di tempo, quindi ti lascio cercare un po' sul materiale che ti ho fornito.

PM Quote
Avatar
shpalman62 (Normal User)
Newbie


Messaggi: 19
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 17:29
Venerdì, 24/04/2009
Ti ringrazio per la risposta, ma il problema è che entrambi i files mi vengono forniti così. Il primo file deve rimanere di quel formato perchè c'è già un programma che lo utilizza in lettura. Non esiste proprio un'alternativa? Ho provato ad utilizzare il metodo file.writealltext ma c'è qualcosa che mi sfugge. Non riesco a sostituire i dati, ma me li accoda. grazie comunque

PM Quote
Avatar
shpalman62 (Normal User)
Newbie


Messaggi: 19
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 17:55
Venerdì, 24/04/2009
Mi ero dimenticato di dire (ma credo che non abbia importanza) che il 2° file è ad accesso casuale.
Questo è quello che avevo fatto io ma come si può vedere non va bene:
Così non funziona, e non riesco a trovare una soluzione.
______________________________________________________________________
FileOpen(1, File2, OpenMode.Random, , , Len(file))
           Do Until EOF(1)
            FileGet(1, file)
            numord1 = UCase(Trim(file.file01))
            prezzo = file.file16
            
            Using leggi As New Microsoft.VisualBasic.FileIO.TextFieldParser(file1)
                leggi.TextFieldType = FileIO.FieldType.Delimited
                leggi.SetDelimiters(";")
                Dim currentrow As String()

                While Not leggi.EndOfData
                    currentrow = leggi.ReadFields()
                    Dim currentfield As String
                    For Each currentfield In currentrow
                        n = n + 1
                        campo(n) = currentfield
                        numord2 = UCase(campo(2))
                        If numord2 = numord1 Then campo(22) = prezzo
                        If n < 22 Then
                         My.Computer.FileSystem.WriteAllText(file2, campo(n) & ";", True)
                        Else
                         My.Computer.FileSystem.WriteAllText(file2, campo(n), True)
                         My.Computer.FileSystem.WriteAllText(file2, vbCrLf, False)
                         n = 0
                        End If
                    Next
                End While
            End Using
          Loop

PM Quote
Avatar
shpalman62 (Normal User)
Newbie


Messaggi: 19
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 18:24
Venerdì, 24/04/2009
X Totem.
Ti ringrazio. La tua soluzione mi sembra molto interessante. ci proverò e ti farò sapere. Grazie ancora.

PM Quote