2009-09-10 2 views
7

Desidero aprire un file errato, copiare tutti i dati e scrivere in un file di testo.Come leggere un file e scrivere in un file di testo?

Il mio file errato.

Nome file - 1.mis

M3;3395;44;0;1;;20090404;094144;8193;3;0;;;; 
M3;3397;155;0;2;;20090404;105941;8193;3;0;;;; 
M3;3396;160;0;1;;20090404;100825;8193;3;0;;;; 
M3;3398;168;0;2;;20090404;110106;8193;3;0;;;; 

così via ...,

I dati di cui sopra dovrebbe apparire in un file di testo con lo stesso nome del file (1.txt).

Ho provato questo codice.

Dim sFileText As String 
Dim iFileNo As Integer 
iFileNo = FreeFile 
Open "C:\Clients\Converter\Clockings.mis" For Input As #iFileNo 
Do While Not EOF(iFileNo) 
Input #iFileNo, sFileText 
Loop 
Close #iFileNo 

Open "C:\Clients\Converter\2.txt" For Output As #iFileNo 
Do While Not EOF(iFileNo) 
Write #iFileNo, sFileText 
Loop 
Close #iFileNo 

Nulla viene salvato in 1.txt.

+1

Beh, se i mis il file memorizza di dati come testo, si può solo copiare il file 1.txt ... :-) –

+2

Non c'è niente in 1.txt perché si sta scrivendo a 2.txt ... –

risposta

13

E 'molto più facile da usare il runtime di script che viene installato di default su Windows

Basta andare a Project Reference e controllare Microsoft Scripting Runtime e fare clic su OK.

quindi è possibile utilizzare questo codice, che è il modo migliore di file predefinito comandi

Dim FSO As FileSystemObject 
Dim TS As TextStream 
Dim TempS As String 
Dim Final As String 
Set FSO = New FileSystemObject 
Set TS = FSO.OpenTextFile("C:\Clients\Converter\Clockings.mis", ForReading) 
'Use this for reading everything in one shot 
Final = TS.ReadAll 
'OR use this if you need to process each line 
Do Until TS.AtEndOfStream 
    TempS = TS.ReadLine 
    Final = Final & TempS & vbCrLf 
Loop 
TS.Close 

Set TS = FSO.OpenTextFile("C:\Clients\Converter\2.txt", ForWriting, True) 
    TS.Write Final 
TS.Close 
Set TS = Nothing 
Set FSO = Nothing 

Per quanto riguarda ciò che è sbagliato con il codice originale qui si sta leggendo ogni riga del file di testo.

Input #iFileNo, sFileText 

Allora qui si scrive fuori

Write #iFileNo, sFileText 

sFileText è una variabile stringa in modo ciò che sta accadendo è che ogni volta che si legge, è sufficiente sostituire il contenuto della sFileText con il contenuto della linea che si appena letto.

Così quando si va a scrivere, tutto ciò che si sta scrivendo è l'ultima riga che si legge, che è probabilmente una riga vuota.

Dim sFileText As String 
Dim sFinal as String 
Dim iFileNo As Integer 
iFileNo = FreeFile 
Open "C:\Clients\Converter\Clockings.mis" For Input As #iFileNo 
Do While Not EOF(iFileNo) 
    Input #iFileNo, sFileText 
sFinal = sFinal & sFileText & vbCRLF 
Loop 
Close #iFileNo 

iFileNo = FreeFile 'Don't assume the last file number is free to use 
Open "C:\Clients\Converter\2.txt" For Output As #iFileNo 
Write #iFileNo, sFinal 
Close #iFileNo 

Nota che non è necessario eseguire un ciclo per scrivere. sFinal contiene il testo completo del file pronto per essere scritto in un colpo solo. Nota che l'input legge una LINE alla volta, quindi ogni riga aggiunta a sFinal deve avere un CR e LF aggiunto alla fine per essere scritto correttamente su un sistema MS Windows. Altri sistemi operativi potrebbero necessitare solo di un LF (Chr $ (10)).

Se è necessario elaborare i dati in entrata, è necessario eseguire un'operazione di questo tipo.

Dim sFileText As String 
Dim sFinal as String 
Dim vTemp as Variant 
Dim iFileNo As Integer 
Dim C as Collection 
Dim R as Collection 
Dim I as Long 
Set C = New Collection 
Set R = New Collection 

iFileNo = FreeFile 
Open "C:\Clients\Converter\Clockings.mis" For Input As #iFileNo 
Do While Not EOF(iFileNo) 
    Input #iFileNo, sFileText 
    C.Add sFileText 
Loop 
Close #iFileNo 

For Each vTemp in C 
    Process vTemp 
Next sTemp 

iFileNo = FreeFile 
Open "C:\Clients\Converter\2.txt" For Output As #iFileNo 
For Each vTemp in R 
    Write #iFileNo, vTemp & vbCRLF 
Next sTemp 
Close #iFileNo 
+0

Alcuni computer utente non hanno FileSystemObject (ne ho avuto esperienza). Penso che i dipartimenti IT troppo zelanti a volte calpestino il tempo di esecuzione dello script per paura dei virus – MarkJ

+0

Sì, ecco perché è necessario includere come parte dell'installazione. Il sysop può quindi decidere se fare un'eccezione per l'applicazione. Oppure crea la tua versione avvolgendo la funzione nativa o avvolgi l'equivalente .NET. Entrambi sono overkill IMO. –

2
FileCopy "1.mis", "1.txt" 
+0

Filecopy funziona, Supponiamo di voler aggiungere qualcosa in un file di testo di destinazione, Come creare codice. – Gopal

2
An example of reading a file: 
Dim sFileText as String 
Dim iFileNo as Integer 
iFileNo = FreeFile 
'open the file for reading 
Open "C:\Test.txt" For Input As #iFileNo 
'change this filename to an existing file! (or run the example below first) 

'read the file until we reach the end 
Do While Not EOF(iFileNo) 
Input #iFileNo, sFileText 
'show the text (you will probably want to replace this line as appropriate to your program!) 
MsgBox sFileText 
Loop 

'close the file (if you dont do this, you wont be able to open it again!) 
Close #iFileNo 
(note: an alternative to Input # is Line Input # , which reads whole lines). 


An example of writing a file: 
Dim sFileText as String 
Dim iFileNo as Integer 
iFileNo = FreeFile 
'open the file for writing 
Open "C:\Test.txt" For Output As #iFileNo 
'please note, if this file already exists it will be overwritten! 

'write some example text to the file 
Print #iFileNo, "first line of text" 
Print #iFileNo, " second line of text" 
Print #iFileNo, "" 'blank line 
Print #iFileNo, "some more text!" 

'close the file (if you dont do this, you wont be able to open it again!) 
Close #iFileNo 

Da Here

+0

Vedere, @Gopal: Sopra lo stesso ** i dati ** dovrebbero apparire in un file di testo con lo stesso. Lui/lei ha bisogno di un FileCopy. – adatapost

+0

@Khenu - In un file sorgente ho n numero di righe, Come si fa un codice? – Gopal

3

Se si vuole fare riga per riga:

Dim sFileText As String 
Dim iInputFile As Integer, iOutputFile as integer 

iInputFile = FreeFile 
Open "C:\Clients\Converter\Clockings.mis" For Input As #iInputFile 
iOutputFile = FreeFile 
Open "C:\Clients\Converter\2.txt" For Output As #iOutputFile 
Do While Not EOF(iInputFile) 
    Line Input #iInputFile , sFileText 
    ' sFileTextis a single line of the original file 
    ' you can append anything to it before writing to the other file 
    Print #iOutputFile, sFileText 
Loop 
Close #iInputFile 
Close #iOutputFile