У меня есть файл размером более 1,5 ГБ, я хочу разделить его на более мелкие куски, чтобы выполнить некоторую работу и повторно добавить после.
У меня есть скрипт ниже, который разбивает на х количество строк. Файл может содержать строки, которые представляют собой смесь разделителей только для CRLF и LF.
Я бы хотел разделить на x количество разделителей строк CRLF, поскольку в существующем сценарии я мог бы разделить два полных записи данных. CRLF является определяющим разделителем между записями, LF существуют в полях свободного текста.
Примечание: Приведенный ниже код также превращает существующий LF в CRLF. Я хотел бы сохранить разделители строк в соответствии с оригиналом.
Версия 5.1
$sourceFolder_local="D:\FileCleaning\"
$raw = $sourceFolder_local + $file.name
#split test
$sw = new-object System.Diagnostics.Stopwatch
$sw.Start()
$filename = $raw
$rootName = $raw.Replace(".csv","")
$ext = ".csv"
$linesperFile = 100000
$filecount = 1
$reader = $null
try{
$reader = [io.file]::OpenText($filename)
try{
"Creating file number $filecount"
$writer = [io.file]::CreateText("{0}{1}.{2}" -f ($rootName,$filecount.ToString("000"),$ext))
$filecount++
$linecount = 0
while($reader.EndOfStream -ne $true) {
"Reading $linesperFile"
while( ($linecount -lt $linesperFile) -and ($reader.EndOfStream -ne $true)){
$writer.WriteLine($reader.ReadLine());
$linecount++
}
if($reader.EndOfStream -ne $true) {
"Closing file"
$writer.Dispose();
"Creating file number $filecount"
$writer = [io.file]::CreateText("{0}{1}.{2}" -f ($rootName,$filecount.ToString("000"),$ext))
$filecount++
$linecount = 0
}
}
} finally {
$writer.Dispose();
}
} finally {
$reader.Dispose();
}
$sw.Stop()
Write-Host "Split complete in " $sw.Elapsed.TotalSeconds "seconds"