Newsgroup: it.comp.lang.visual-basic
Titolo: Lettura sequenziale da file

Buongiorno a tutti.
In un mio programma leggo da un file di testo dove gli elementi
significativi sono separati da virgole
alcuni valori numerici o di testo ponendoli su delle variabili.
Ora il problema e' che in alcuni casi c'e' un comportamento anomalo.
Supponendo che una riga di input sia
Input #11, valore1, valore2
con valore1 e valore2 di tipo string
se nel file ho nella riga di lettura ad esempio ho:
MAGAZZINO PEZZI TARANTO, MARIO ROSSI
magari carica in valore1 MAGAZZINO PEZZI TARANTO
e in valore2                    MARIO ROSSIEZZI TARANTO
come se non svuotasse il buffer di lettura, ma andasse solo a
rimpiazzare alcuni dei nuovi caratteri, lasciando intatti quelli
precedentemente letti.
L'esempio fatto e' solo uno dei tre o quattro casi simili capitati.
E' evidente che c'e' qualche cosa che non so.
L'apertura del file la faccio cosi':
   percorso = App.Path + "\Surveys\" + codice + ".sur"
   Open percorso For Input As 11
Qualcuno avrebbe delle indicazioni da darmi?
Grazie infinite.
Marco

 wrote in message
news:9d9471$t54$1...@fe1.cs.interbusiness.it...


Dopo l'apertura leggi col line input?
Io farei cosě (metti una listbox ed un command button in un form e
copiaci dentro tutto)...
Sub Command1_click()
    Dim RowFromFile As String, x As Integer
    Dim NumParsedData As Integer, l As Integer
    ReDim ParsedData(100) As String 'bastano?
    List1.Clear
    x = FreeFile
    Open "c:\newmedia\iplverify\wordbord.bas" For Input As #x
        While Not EOF(x)
            Line Input #x, RowFromFile
            MyParser RowFromFile, ParsedData, NumParsedData, ","
            For l = 0 To NumParsedData
                List1.AddItem ParsedData(l)
            Next l
        Wend
    Close #x
End Sub
Sub MyParser(ToParse, ParseData, nPD, SeparatorChar)
    Dim l As Integer
    nPD = 0
    For l = 1 To Len(ToParse)
        If Mid(ToParse, l, 1) = SeparatorChar Then
            nPD = nPD + 1
        Else
            ParseData(nPD) = ParseData(nPD) + Mid(ToParse, l, 1)
        End If
    Next
End Sub
Si potrebbe fare dichiarando diversamente l'array ed usando
lboud/ubound... Ma non mi ricordavo bene e forse si legge anche
meglio...
Bye
--
-> GbC
http://www.chiappori.net
http://www.gbcweb.com

Azzardo:
    Premessa: l'esempio di input è corretto e corrispondente alla
realtà.
 
    Suppongo dipenda dalla mancanza dei delimitatori di stringhe
carattere 
    che la funzione Input si attende (il doppio apice).
    Ovvero un input corretto sarebbe:
        "Il buon programmatore", "non dimentica che è meglio usare
Freefile"
    ed allora puoi invocare:
        Input #fDescriptor strCampoA, strCampoB
    Per ottenere un Input così formattato il tuo file .sur DEVE essere
scritto
    mediante funzione Write, non Print.
    Se usi Print per scrivere allora usi LineInput per leggere (che però
NON elimina
    automaticamente le virgole di delimitazione e quindi devi fare il
Parsing o usare
    cum grano salis la funzione Split di VB6).
    Se non desideri i delimitatori utilizza Put, per la scrittura e Get
per la 
    lettura, tuttavia devi conoscere e dichiarare a priori la lunghezza
del record da leggere.
    Oppure puoi avvalerti del filesystemobject (cfr. MSDN) se le
operazioni su file sono banali.
    E non dimenticare: usa la funzione FreeFile non 11 o altri valori
arbitrari.
    Non posso garantire che quanto esposto risolva definitivamente il
problema.
Ciao 
   Adriano


 wrote in message
9d9471$t54$1...@fe1.cs.interbusiness.it...

Se il separatore è sempre lo stesso ti conviene usare la
funzione split che ti spezza automaticamente la stringa in
tanti campi in base al delimitatore passato caricandoteli
su un array.
Ciao
Alex

 ha scritto

il codice qui sotto mi leggeva in text1 dei txt con campi separati da punto
e virgola. vedi se puo' servirti. split() e' di vb6, pero'. col 5 si deve
andare di mid e instr.
ciao, a.
Private Sub cmdImport_Click()
    On Error GoTo errman
    Dim fName As String, nLine As String
    Dim fNum As Integer. str() As String
    fNum = FreeFile
    fName = App.Path & "\foo.txt"
    Open fName For Input As #fNum
    Text1 = ""
    Do Until EOF(fNum)
        Line Input #fNum, nLine
If InStr(nLine, ";") Then
        str() = Split(nLine, ";")
        Text1 = Text1 & str(0) & " -- " & str(1) & vbCrLf
        Text1.SelStart = Len(Text1)
End If
        DoEvents
    Loop
    Exit Sub
errman:
    Text1 = Text1 & vbCrLf & "##################"
    Text1 = Text1 & vbCrLf & Err & " -- " & Error
    Text1 = Text1 & vbCrLf & "##################"
    Text1 = Text1 & vbCrLf
    Resume Next
End Sub

Grazie a tutti per i suggerimenti.
Mi sono dimenticato di indicarvi alcune cose pero':
1) La lettura solitamente funziona in modo corretto, solo in tre casi
fin'ora, dove uno dei campi da
    leggere superava una certa lunghezza (23 caratteri, non so se significhi
qualche cosa) ho avuto queste
    anomalie;
2) Il modo di scrittura del file e' il seguente: io raccolgo gli elementi da
scrivere in un'unica grande stringa
    con gli elementi opportunamente separati da virgole, e quelle che devono
essere separate per righe con
    l'inserimento di return, quindi alla fine io scrivo un'unica stringa che
si chiama  PeriziaCompleta e poi faccio
         Open pathper For Output As 20
         Print #20, PeriziaCompleta
         Close 20
    Non posso inserire doppi apici nel file, in quanto detto file viene
anche inviato per e-mail a uno script
    Unix che non li supporta.
3) Tali inconvenienti capitano solo lanciando l'eseguibile, ma se invece
apro il progetto e lo eseguo in debug
    (anche senza breakpoint) le anomalie non si presentano, quindi io non ho
nemmeno la possibilita' di
    fare il debug del problema.
Comunque iniziero' a seguire i vostri suggerimenti.
Se ne avete altri saranno comunque molto graditi.
Grazie ancora.
Marco