2012-06-08 10 views
11

Ho un file di testo creato su linux, se lo apro in Word pad il file appare normalmente. Tuttavia quando lo apro nel blocco note e quando provo a caricarlo in excel usando il codice sottostante appare come una singola riga.Caricamento di file di testo linux in excel usando VBA

' Open the file 
Open Filename For Input As #1 

' Look for the Table Title 
Do While Not (EOF(1) Or InStr(TextLine, TableTitle) > 0) 
    Line Input #1, TextLine 
Loop 

Come posso dividerlo nelle righe originali? C'è un separatore di fine linea, che vba può usare?

risposta

11

Linux utilizza un line-feed (\n) per indicare una nuova linea, piuttosto che il ritorno del carrello + line-feed (\r\n) usati per Windows in modo non è possibile utilizzare Line input, invece:

Open Filename For Input As #1 
'//load all 
buff = Input$(LOF(1), #1) 
Close #1 

'//*either* replace all lf -> crlf 
buff = replace$(buff, vbLf, vbCrLf) 
msgbox buff 

'//*or* line by line 
dim lines() As String: lines = split(buff, vbLf) 
for i = 0 To UBound(lines) 
    msgbox lines(i) 
next 
+0

Se si deve eseguire l'elaborazione riga per riga, si desidera eseguire 'buff = replace $ (buff, vbCrLf, vbLf)' _ e_ quindi eseguire la logica 'split()'. In questo modo le terminazioni di linea di Windows sono normalizzate in stile Unix. – kornman00

3

La funzione

Public Function GetLines(fpath$) As Variant 
    'REFERENCES: 
    'Microsoft Scripting Runtime // Scripting.FileSystemObject 
    'Microsoft VBScript Regular Expressions 5.5 // VBScript_RegExp_55.RegExp 
    Dim fso As New Scripting.FileSystemObject, RE As New VBScript_RegExp_55.RegExp 
    If fso.FileExists(fpath) = True Then 
     Dim mts As MatchCollection, mt As Match 
     Dim lines() As String 
     Dim content$: content = fso.OpenTextFile(fpath).ReadAll() 
     With RE 
      .Global = True 
      .Pattern = "[^\r\n]+" 'catch all characters except NewLines/Carraige Returns 
      If .test(content) = True Then 
       Set mts = .Execute(content) 
       ReDim lines(mts.Count - 1) 
       Dim pos& 
       For Each mt In mts 
        lines(pos) = mt.Value 
        pos = pos + 1 
       Next mt 
      Else 
       MsgBox "'" & Dir(fpath) & "' contains zero bytes!", vbExclamation 
      End If 
     End With 
     GetLines = lines 
    Else 
     MsgBox "File not found at:" & vbCrLf & Dir(fpath), vbCritical 
    End If 
End Function 

e potrebbe opporre (da immediate window)

?GetLines("C:\BOOT.INI")(2) 

e l'uscita

default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS 

L'esempio di cui sopra potrebbe essere usato per ottenere tutte le righe da qualsiasi file di testo origine da qualsiasi sistema operativo.


Spero che questo aiuti.

+0

2 anni dopo e questo mi ha risparmiato un sacco di lavoro, grazie mille. Non mi è venuto in mente fino a quando le cose non hanno funzionato, che i file su cui sto lavorando provengono da diversi sistemi operativi! Questo è un risparmiatore di vita. – RossC