Wydaje mi się, że wymyśliłem bardzo skuteczny sposób, aby czytać bardzo, bardzo duże pliki wiersz po linii. Proszę powiedz mi, czy znasz lepszy/szybszy sposób lub widzisz możliwość poprawy. Próbuję poprawić kodowanie, więc każda rada, którą masz, byłaby miła. Mam nadzieję, że jest to coś, co inni mogą uznać za przydatne.Jaki jest superszybki sposób czytania dużych plików liniowo po linii w VBA?
Wydaje się to być coś jak 8 razy szybciej niż przy użyciu wejścia liniowego z moich testów.
'This function reads a file into a string. '
'I found this in the book Programming Excel with VBA and .NET. '
Public Function QuickRead(FName As String) As String
Dim I As Integer
Dim res As String
Dim l As Long
I = FreeFile
l = FileLen(FName)
res = Space(l)
Open FName For Binary Access Read As #I
Get #I, , res
Close I
QuickRead = res
End Function
'This function works like the Line Input statement'
Public Sub QRLineInput(_
ByRef strFileData As String, _
ByRef lngFilePosition As Long, _
ByRef strOutputString, _
ByRef blnEOF As Boolean _
)
On Error GoTo LastLine
strOutputString = Mid$(strFileData, lngFilePosition, _
InStr(lngFilePosition, strFileData, vbNewLine) - lngFilePosition)
lngFilePosition = InStr(lngFilePosition, strFileData, vbNewLine) + 2
Exit Sub
LastLine:
blnEOF = True
End Sub
Sub Test()
Dim strFilePathName As String: strFilePathName = "C:\Fld\File.txt"
Dim strFile As String
Dim lngPos As Long
Dim blnEOF As Boolean
Dim strFileLine As String
strFile = QuickRead(strFilePathName) & vbNewLine
lngPos = 1
Do Until blnEOF
Call QRLineInput(strFile, lngPos, strFileLine, blnEOF)
Loop
End Sub
Dzięki za poradę!
ten jest bardzo dobry punkt. Byłem dość naiwnie przesadzony, używając dwóch własnych. Rozmiar plików, których używam, wynosi od pięciu do dziesięciu megabajtów i nie więcej niż pięćdziesiąt. – Justin
** Maksymalna długość łańcucha o zmiennej długości ** w VB i VBA wynosi ok. ** 2 miliardy znaków ** (inaczej 2 GB). (Źródło: [VBA] (https://msdn.microsoft.com/en-us/vba/language-reference-vba/articles/data-type-summary) i [VB] (https://docs.microsoft. com/en-us/dotnet/visual-basic/language-reference/data-types/data-type-summary)) – ashleedawg
@ashleedawg, dzięki za informację. Nieznaczna korekta: limit wynosi 4 GB, ponieważ rozmiar każdego znaku wynosi 2 bajty (Unicode). –