#powershell
#powershell
Вопрос:
Я отправляю запрос, который возвращает результаты размером 1 600 КБ, и я хочу отправить его в файл Excel, я пытался сделать это с помощью экспорта в csv, но мне не повезло, потому что он превышает чуть более 1 млн. Есть ли способ разделить этот результирующий набор так, чтобы при заполнении одного листа онпередает остальное на другой лист?
это мой код, без отображения запроса, учетных данных, ха-ха, спасибо за вашу помощь
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$SqlAdapter.SelectCommand.CommandTimeout=1200
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
return $DataSet.Tables[0] | select * | Export-CSV "C:UsersMX02689DesktopDemandaAlta.csv" -NoTypeInformation
$SqlConnection.Close()
Ответ №1:
Вы могли бы «буферизировать» результаты запроса вручную, а затем экспортировать фрагменты в отдельные файлы по мере заполнения буфера:
$sheetSize = 100000 # Let's do 100K records per sheet
$buffer = [System.Collections.Generic.List[object]]::new($sheetSize)
# ...
$sheetNumber = 1
$DataSet.Tables[0] |ForEach-Object{
if($buffer.Count -eq $sheetSize){
# buffer is full, time to flush
$buffer |Select * |Export-Csv "C:UsersMX02689DesktopDemandaAlta_sheet_${sheetNumber}.csv" -NoTypeInformation
$sheetNumber = 1
$buffer.Clear()
}
$buffer.Add($_)
}
if($buffer.Count -eq $sheetSize){
# buffer still has data, time to flush one last time
$buffer |Select * |Export-Csv "C:UsersMX02689DesktopDemandaAlta_sheet_${sheetNumber}.csv" -NoTypeInformation
}
Что для > 1,6 млн записей приведет к созданию файлов DemandaAlta_sheet_1.csv
через DemandaAlta_sheet_17.csv
created .
Комментарии:
1. Привет, и, например, если я пытаюсь указать 1M в качестве размера листа, чтобы таким образом я мог иметь 1M в одном файле, а остальные в другом, но это создает только один файл, а остальные игнорируются, есть ли способ это сделать? извините, что снова беспокою вас, и спасибо за всю вашу помощь 🙂
2. @HeberSolis
$DataSet.Tables[0] |Select -First 1000000 |Export-Csv ...
3. но тогда я бы удалил весь буфер? потому что это произойдет только в том случае, если buffer.count -eq 1000000, не так ли? :/
4. Да, буферизация совершенно не нужна, вы просто хотите экспортировать первые N записей и ничего больше —
$DataSet.Tables[0] |Select -First 1000000 |Export-Csv ...
это все, что вам нужно для этого