Meine Anforderung war etwas anders. Ich arbeite oft mit durch Kommas getrennten und durch Tabulatoren getrennten ASCII-Dateien, bei denen eine einzelne Zeile ein einzelner Datensatz von Daten ist. Und sie sind wirklich groß, also muss ich sie in überschaubare Teile aufteilen (unter Beibehaltung der Kopfzeile).
Also kehrte ich zu meiner klassischen VBScript-Methode zurück und schlug ein kleines .vbs-Skript zusammen, das auf jedem Windows-Computer ausgeführt werden kann (es wird automatisch von der Skript-Host-Engine WScript.exe unter Windows ausgeführt).
Der Vorteil dieser Methode besteht darin, dass Textströme verwendet werden, sodass die zugrunde liegenden Daten nicht (oder zumindest nicht alle gleichzeitig) in den Speicher geladen werden. Das Ergebnis ist, dass es außergewöhnlich schnell ist und nicht wirklich viel Speicher benötigt, um ausgeführt zu werden. Die Testdatei, die ich gerade mit diesem Skript auf meinem i7 geteilt habe, hatte eine Dateigröße von ungefähr 1 GB, hatte ungefähr 12 Millionen Testzeilen und erstellte 25 Teiledateien (jede mit jeweils ungefähr 500.000 Zeilen) - die Verarbeitung dauerte ungefähr 2 Minuten und es dauerte nicht Gehen Sie zu keinem Zeitpunkt über 3 MB Speicher.
Die Einschränkung hierbei ist, dass die Textdatei "Zeilen" enthält (dh jeder Datensatz wird durch eine CRLF begrenzt), da das Textstromobjekt die Funktion "ReadLine" verwendet, um jeweils eine einzelne Zeile zu verarbeiten. Aber hey, wenn Sie mit TSV- oder CSV-Dateien arbeiten, ist es perfekt.
Option Explicit
Private Const INPUT_TEXT_FILE = "c:\bigtextfile.txt" 'The full path to the big file
Private Const REPEAT_HEADER_ROW = True 'Set to True to duplicate the header row in each part file
Private Const LINES_PER_PART = 500000 'The number of lines per part file
Dim oFileSystem, oInputFile, oOutputFile, iOutputFile, iLineCounter, sHeaderLine, sLine, sFileExt, sStart
sStart = Now()
sFileExt = Right(INPUT_TEXT_FILE,Len(INPUT_TEXT_FILE)-InstrRev(INPUT_TEXT_FILE,".")+1)
iLineCounter = 0
iOutputFile = 1
Set oFileSystem = CreateObject("Scripting.FileSystemObject")
Set oInputFile = oFileSystem.OpenTextFile(INPUT_TEXT_FILE, 1, False)
Set oOutputFile = oFileSystem.OpenTextFile(Replace(INPUT_TEXT_FILE, sFileExt, "_" & iOutputFile & sFileExt), 2, True)
If REPEAT_HEADER_ROW Then
iLineCounter = 1
sHeaderLine = oInputFile.ReadLine()
Call oOutputFile.WriteLine(sHeaderLine)
End If
Do While Not oInputFile.AtEndOfStream
sLine = oInputFile.ReadLine()
Call oOutputFile.WriteLine(sLine)
iLineCounter = iLineCounter + 1
If iLineCounter Mod LINES_PER_PART = 0 Then
iOutputFile = iOutputFile + 1
Call oOutputFile.Close()
Set oOutputFile = oFileSystem.OpenTextFile(Replace(INPUT_TEXT_FILE, sFileExt, "_" & iOutputFile & sFileExt), 2, True)
If REPEAT_HEADER_ROW Then
Call oOutputFile.WriteLine(sHeaderLine)
End If
End If
Loop
Call oInputFile.Close()
Call oOutputFile.Close()
Set oFileSystem = Nothing
Call MsgBox("Done" & vbCrLf & "Lines Processed:" & iLineCounter & vbCrLf & "Part Files: " & iOutputFile & vbCrLf & "Start Time: " & sStart & vbCrLf & "Finish Time: " & Now())
split
(ein Unix / Linux-Dienstprogramm), aber ein Tag, mitbatch-file
dem Windows ist.