Я пытаюсь загрузить очень большие файлы CSV в SQL Server с помощью Powershell. Код также должен применять замены регулярных выражений «на лету», допускать различные разделители, маркеры EOR и EOF. Для обслуживания мне бы очень хотелось, чтобы вся эта логика существовала в Powershell без импорта сборок.
Чтобы быть эффективным, я знаю, что мне нужно использовать метод SQLBulkCopy. Но все примеры Powershell, которые я вижу, заполняют DataTable и передают его, что для меня невозможно из-за размера файла.
Я почти уверен, что мне нужно обернуть StreamReader в Idatareader, а затем передать это в SQLBulkcopy. Я нашел пару отличных примеров реализации этого на C#:
http://archive.msdn.microsoft.com/FlatFileDataReader
http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader
Можно ли выполнить эту функцию с помощью собственного PowerShell без импорта сборки C#? Мне особенно трудно преобразовать оболочку абстрактного класса.
Это код, который у меня есть до сих пор, который не передает IdataReader и нарушает ограничения памяти.
function Get-CSVDataReader()
{
param (
[string]$path
)
$parsedData = New-Object 'System.Collections.Generic.List[string]'
#List<string[]> parsedData = new List<string[]>()
$sr = new-object IO.StreamReader($path)
while ($line = $sr.ReadLine())
{
#regex replace and other logic here
$parsedData.Add($line.Split(','))
}
,$parsedData #if this was an idatareader, the comma keeps it from exploding
}
$MyReader = Get-CSVDataReader('This should not fill immediately. It needs a Read Method.')
Большое спасибо за помощь.