Newsgroup: it.comp.lang.visual-basic
Titolo: Lettura File

Devo leggere un file le cui righe non sono separate da vbCrLf ma da vbLf,
mettendone il contenuto in un vettore che ha un record per ogni riga del
file. Facendo un Line Input pesco tutto il file (che poi devo spacchettare
tramite uno Split). Non esiste un sistema per fare l'input di una riga
indicando qual'è il separatore?
Grazie!!!
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 l'input di una riga indicando qual'è il separatore?
umm umm se non ti e' possibile usare la modalita' binaria , allora aggira il
proglema :
 da programma :
lanci Wordpad in hide conil file come parametro, tramite sendkeys lanci un
replace con un vbnewline al posto del vblf
da qui in poi prosegui il programma normalmente !
-- 
-Gigio@Work(?)-

 lanci un replace con un vbnewline al posto del vblf
E tu dici che è possibile sostituire un "vai a capo" con qualcos'altro (o,
da che ci siamo, viceversa)?
Oh, sarà, ma io non sono mai stato capace, nemmno con MsWord
Mi dici come si deve indicare il carattere "speciale" da sostituire (o
sostituente)?
Grazie.

 Grazie.
Pregolo
Per test apri word, scivi due parole separate da un "a capo"
e poi vai di replace : "^p" con " -VadoACapo- "
-- 
-Gigio@Work(?)-


Con WordPad ho qualche dubbio, e in ogni caso prima di fare una procedura
automatica con SendKeys mi farei il segno della croce (ammesso e non
concesso che funzioni con la finestra nascosta)
Con Word invece, help on line alla mano ;-), e' sufficiente la sostituzione
normale:
Trova: ^p
Sostituisci: ^010
^0 ti permette di impostare direttamente un codice ASCII
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 sostituzione normale:
umm pero' visto che dobbiamo scomodare word a sto punto conviene aprirlo in
binario e fare noi la sostituzione da codice !
-- 
-Gigio@Work(?)-

 indicando qual'è il separatore?
http://home.clear.net.nz/pages/niche/unix2dos.html
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!


Senza dubbio.... io nemmeno avrei scomodato WordPad, se e' per questo :-)
Rispondevo piu' che altro al quesito di Lupo


 
Ovviamente se lo devi fare dall'interno del programma  c'e' 
l'equivalente "dos" in cui puoi passare il nome del file come parametro. 
Se cerchi con google ...


 
Ecco qua:
http://phoenix.liu.edu/~mdevi/util/page1.htm


 l'input di una riga indicando qual'è il separatore?
Lo split è sicuramente la soluzione più performante, ma presenta
l'inconveniente di dover caricare tutto il file, e questo può non essere
possibile con grosse dimensioni.
L'alternativa è quella di leggere carattere per carattere, appendendolo in
coda ad una stringa, terminando il loop al vbcr o EOF, e ignorando,
proseguendo la lettura al giro dopo, un eventuale VbLf iniziale.
In questo modo, puoi generare una sorta di funzione Line_Input tua, che
funzionerà benissimo sia per file col terminatore VbCrLf sia con terminatori
VbCr.
Ciao
Alberto

 :-) Rispondevo piu' che altro al quesito di Lupo
In effetti anch'io, senza dirlo, ero "OT", ovvero mi riferivo all'uso
diretto degli applicativi WordPad e MsWord, non a codice VB...
Comunque, grazie a entrambi per il ^P

 terminatori VbCr.
Ma car per car è leeeeeento...
Guarda la differenza fra la velocità queste due e dimmi (sempre
parlando di un file relativamente piccolo):
*********************
Sub FiltraUnix(FileIngresso As String, FileUscita As String)
    Dim strTemp As String * 1
    Dim FileLibero1 As Integer, FileLibero2 As Integer
    FileLibero1 = FreeFile
    Open FileIngresso For Binary As #FileLibero1
    If Dir$(FileUscita) <> "" Then Kill FileUscita ' non si sa mai
    FileLibero2 = FreeFile
    Open FileUscita For Output As #FileLibero2
    While Not EOF(FileLibero1)
        Get #FileLibero1, , strTemp
        If strTemp = vbLf Then
            Print #FileLibero2,
        Else
            Print #FileLibero2, strTemp;
        End If
    Wend
    Close FileLibero1, FileLibero2
End Sub
Sub FiltraUnix2(FileIngresso As String, FileUscita As String)
    Dim strInput As String, strOutput As String
    Dim lngPosPrecedente As Long
    Dim lngPosTrovato As Long
    Dim FileLibero1 As Integer, FileLibero2 As Integer
    FileLibero1 = FreeFile
    Open FileIngresso For Input As #FileLibero1
    strInput = Input(LOF(FileLibero1), #FileLibero1)
    If Dir$(FileUscita) <> "" Then Kill FileUscita ' non si sa mai
    FileLibero2 = FreeFile
    Open FileUscita For Output As #FileLibero2
    lngPosPrecedente = 1
    Do
        lngPosTrovato = InStr(lngPosPrecedente, strInput, vbLf)
        If lngPosTrovato <> 0 Then
            Print #FileLibero2, Mid$(strInput, lngPosPrecedente, _
            lngPosTrovato - lngPosPrecedente)
            lngPosPrecedente = lngPosTrovato + 1
        Else
            Print #FileLibero2, Right$(strInput, LOF(FileLibero1) _
            - lngPosPrecedente + 1)
            Exit Do
        End If
    Loop
    Close FileLibero1, FileLibero2
End Sub
*********************
Per un file lungo, io preferisco lavorare a blocchi. Questa è una routine
(di vario tempo fa... abbiate pietà per lo stile) che sostituisce i VbCr con
i VbLf (o è versavice, che non me lo ricordo mai ?).
E per leggere poi linea per linea i VbLf vanno bene :-)))))) così si evita di
spezzare le sottostringhe, cosa che fa perdere una marea di tempo.
******************
Sub TogliCHR10(FileIngresso As String, FileUscita As String)
    StatusLine "Filtro il file " & FileIngresso
    Dim Kappa As Long
    Kappa = 32768
    Dim BloccoDati  As String * 32768
    Dim N As Long
    Dim K As Long
    Dim Bla As String
    Dim NumBlocchi As Long
    Dim Resto As Long
    Dim FileLiberoInput As Integer
    Dim FileLiberoOutput As Integer
    Dim Posiz10 As Long
    N = FileLen(FileIngresso)
    NumBlocchi = N \ Kappa
    Resto = N - (NumBlocchi * Kappa)
    FileLiberoInput = FreeFile
    Open FileIngresso For Binary As #FileLiberoInput
    FileLiberoOutput = FreeFile
    If Dir(FileUscita) <> "" Then Kill FileUscita
    Open FileUscita For Output As #FileLiberoOutput
    For K = 1 To NumBlocchi
        DoEvents
        BloccoDati = Input(Kappa, FileLiberoInput)
        Posiz10 = InStr(BloccoDati, vbLf)
        Do While (Posiz10 <> 0) And (Posiz10 <= Kappa)
            Mid$(BloccoDati, Posiz10, 1) = vbCr
            Posiz10 = InStr(BloccoDati, vbLf)
            If Posiz10 = 0 Then Exit Do
        Loop
        Print #FileLiberoOutput, BloccoDati;
    Next K
    BloccoDati = Input(Resto, FileLiberoInput)
    Posiz10 = InStr(BloccoDati, vbLf)
    Do While (Posiz10 <> 0) And (Posiz10 <= Kappa)
        Mid$(BloccoDati, Posiz10, 1) = vbCr
        Posiz10 = InStr(BloccoDati, vbLf)
        If Posiz10 = 0 Then Exit Do
    Loop
    Print #FileLiberoOutput, Left$(BloccoDati, Resto);
    Close
          Kill FileIngresso
          Name FileUscita As FileIngresso
    StatusLine "Filtraggio terminato "
End Sub
Sub StatusLine(Testo As String)
    Label1.Caption = Testo
    DoEvents
End Sub
***********************
Bye, G.

 indicando qual'è il separatore?
Forse dalle altre spiegazioni che ti hanno dato ho
capito fischi per fiaschi io ... ma prova :
fai il test con un file di prova sacrificabile
'*.vbs
set fso=createobject("scripting.filesystemobject")
myfile = "C:\test.txt"
oldX = vbLf
newX = vbCrLf
sData = f_r(myfile)
sData = Replace(sData,oldX,newX)
f_w sData, myfile
Function f_r(FilePath)
  f_r = FSO.OpenTextFile(FilePath,1).ReadAll
End Function
Sub f_w(sData,FilePath)
 fileRef = FSO.OpenTextFile(FilePath, 2, True).WriteLine(sData)
End Sub
--
Fosco