2012-06-08 28 views
11

Mam plik tekstowy utworzony na Linuksie, jeśli otworzę go w Word pad, plik pojawi się normalnie. Jednak kiedy otworzę go w notatniku, a kiedy spróbuję załadować go do programu Excel za pomocą poniższego kodu, pojawi się on jako pojedyncza linia.Ładowanie pliku tekstowego Linuksa do programu Excel za pomocą 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 

Jak mogę podzielić go na oryginalne linie? Czy istnieje końcówka seperatora linii, z której może korzystać vba?

Odpowiedz

11

Linux wykorzystuje nowego wiersza (\n) określający nową linię zamiast zwrotu karetki + line-feed (\r\n) jako używany przez Windows, więc nie można użyć Line input, zamiast:

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

Jeśli musisz wykonać przetwarzanie wiersz po wierszu, chcesz wykonać polecenie 'buff = replace $ (buff, vbCrLf, vbLf)' _ i_, a następnie wykonaj operację 'split()'. W ten sposób zakończenia linii Windows są znormalizowane do stylu Unix. – kornman00

3

Funkcja

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 

i może być wywołana przez (od immediate window)

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

i wyjściu

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

Powyższy przykład może być wykorzystywana, aby uzyskać wszystkie wiersze z dowolnego pliku tekst pochodzi z dowolny system operacyjny.


Mam nadzieję, że to pomoże.

+0

2 lata później i to zaoszczędziło mi dużo pracy, dziękuję bardzo. Nie przyszło mi do głowy, dopóki coś nie poszło nie tak, że pliki, nad którymi pracuję, pochodzą z wielu różnych systemów operacyjnych! To jest ratownik. – RossC

Powiązane problemy