我想使用Powershell將極大的CSV文件加載到SQL Server中。該代碼還必須適用於飛行正則表達式替換,允許各種分隔符,EOR和EOF標記。對於維護,我真的很喜歡所有這些邏輯存在於Powershell中,而無需導入程序集。Powershell:圍繞流讀取器實現IdataReader包裝
爲了高效,我知道我需要使用SQLBulkCopy方法。但是,我看到的所有Powershell示例都填充了一個DataTable並將其傳遞給我,這是因爲文件大小而無法實現的。
我很確定我需要在Idatareader中包裝StreamReader,然後將其傳遞給SQLBulkcopy。我發現這幾個很好的例子,在C#中實現:
http://archive.msdn.microsoft.com/FlatFileDataReader
http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader
是否有可能不導入C#組件來完成使用本地PowerShell的這個功能?我特別難以轉換抽象類包裝。
這是我到目前爲止沒有通過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.')
非常感謝幫助。
我不知道Powershell,但在C#中,您只需將大文件分解爲更小的塊,然後一次一個塊地填充數據表並使用SqlBulkCopy。 –
這不是一個更適合SSIS的任務嗎? – alroc
我也想使用PowerShell來驅動工作流程。不得不調用一組臃腫,難以調試的SSIS中間包來做一個高度動態的加載似乎不符合直覺。我正在尋找更簡單的Perl類型的方法。 – Snowdogging