[Poweshell] Split Big Flat File (CSV/TXT...)

1613 ワード

ビジネスでは期首データのインポートが頻繁に発生し、大きなファイル(100 w行を超える)に遭遇した場合
Powershellを使用してファイルを行数で切断し、バッチでインポートすることができます.パフォーマンスの問題や、excel、ssisなどのマイクロソフトコントロールで100 w行以上のデータが読み書きできない問題を回避します.
 
#split test
$sw = new-object System.Diagnostics.Stopwatch
$sw.Start()
$filename = "C:\Source\FullExtract_data.csv"#     
$rootName = "C:\Target\splitOutput"#      
$ext = "csv"#      

$linesperFile = 600000#             
$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"