2012-06-08 6 views
11

Ich habe eine Textdatei auf Linux erstellt, wenn ich es in Word-Pad öffnen, erscheint die Datei normal. Wenn ich es jedoch in Notepad öffne, und wenn ich versuche, es mit dem unten stehenden Code in Excel zu laden, erscheint es als eine einzige Zeile.Laden von Linux-Textdatei in Excel mit 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 

Wie kann ich es in die ursprünglichen Zeilen teilen? Gibt es einen Zeilentrenner, den VBA verwenden kann?

Antwort

11

Linux verwendet einen Zeilenvorschub (\n) eine neue Zeile zu bezeichnen, anstatt den Wagenrücklauf + Zeilenvorschub (\r\n), wie von Windows verwendet, so dass Sie nicht Line input verwenden können, statt:

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

Wenn Sie Zeile-für-Zeile-Verarbeitung durchführen müssen, tun Sie Buff = Ersetze $ (Buff, VbCrLf, VbLf) '_and_ dann tun Sie die' split() 'Logik. Auf diese Weise werden Windows-Zeilenenden auf Unix-Stil normalisiert. – kornman00

3

Die Funktion

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 

und könnte geltend gemacht werden, durch (von immediate window)

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

und dem Ausgang

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

Das obige Beispiel verwendet werden könnte, alle Linien erhalten aus jeder Textdatei aus ihrem Ursprung jedes Betriebssystem.


Hoffe das hilft.

+0

2 Jahre später und das hat mir eine Menge Arbeit erspart, vielen Dank. Es ist mir nicht in den Sinn gekommen, bis die Dinge schiefgelaufen sind, dass die Dateien, an denen ich arbeite, von verschiedenen Betriebssystemen stammen! Dies ist ein Lebensretter. – RossC