CSV大约有一场演出,有100多万行。我正试着把它一分为五。前4个花了大约18个小时--第5个从来没有发生过(或者我没有足够的耐心)我的电脑将只是停留在睡眠模式,因为它不能解锁。
function Split-Csv{
[CmdletBinding()]
Param(
[Parameter(Mandatory)]
[string]$FilePath,
[Parameter()]
[string]$Delimiter=',',
[Parameter(Mandatory)]
[string]$TargetFolder,
[Parameter(Mandatory)]
[string]$Name,
[Parameter(Mandatory)]
[int]$NumberOfFiles
)
try{
if(-not (Test-Path $TargetFolder)){
New-Item -Path $TargetFolder -ItemType Directory
}
$csvData=Import-Csv -Path $FilePath -Delimiter $Delimiter
$startRow=0
$numberOfRowsPerFile=[Math]::Ceiling($csvData.count/$NumberOfFiles)
$counter=1
while($startRow -lt $csvData.Count){
$csvData | Select-Object -Skip $startRow -First $numberOfRowsPerFile | Export-Csv -Path "$TargetFolder\$Name-$counter.csv" -NoTypeInformation -NoClobber
$startRow+=$numberOfRowsPerFile
$counter++
}
}catch{
Write-Error $_.Exception.Message
}
}
Split-Csv -FilePath "C:\temp\2018.csv" -Delimiter ',' -TargetFolder "C:\temp\Split" -Name "Split" -NumberOfFiles 5
2条答案
按热度按时间d7v8vwbk1#
你可以试一试这个函数,正如我在评论中所说的,如果你使用.NETAPI而不是把CSV当作对象,这将会快得多,也是内存友好的。
此函数使用
StreamReader
和StreamWriter
类逐行读写。可以通过PS Gallery以及官方的GitHub Repo获得用法示例以及其对应的
Merge-Csv
。avwztpqn2#
我在不同大小的CSV上测试了以下代码:
我计时了导入-CSV和每个区块导出。导入/导出-CSV的伸缩性不是很好,但对于您正在使用的大小/行来说应该是可以的。我的最后一次测试CSV是1.68 GB、约110万行、7200RPM驱动器,安装在一台5代笔记本电脑上--在更好的硬件上应该运行得更快:
块1的额外时间可能是与磁盘相关的异常情况--在之前的所有测试中,所有块时间几乎相同,导出的总时间与导入时间大致相同。