есть ли способ разделить результирующий набор с помощью exportToCsv?

#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 ... это все, что вам нужно для этого