1

Powershell を使用して、非常に大きな CSV ファイルを SQL Server にロードしようとしています。コードは、さまざまな区切り文字、EOR、および EOF マーカーを許可して、その場で正規表現置換を適用する必要もあります。メンテナンスのために、アセンブリをインポートせずに、このすべてのロジックが Powershell に存在することを本当に望んでいます。

効率的にするには、SQLBulkCopy メソッドを使用する必要があることはわかっています。しかし、私が見る Powershell の例はすべて、DataTable を埋めてそれを渡しますが、ファイル サイズが原因で私には不可能です。

StreamReader を Idatareader でラップしてから、それを SQLBulkcopy に渡す必要があると確信しています。これが C# で実装された素晴らしい例をいくつか見つけまし

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.')

助けてくれてありがとう。

4

2 に答える 2

1

SqlBulkCopyでDataReaderを使用するだけの場合は、Office 2007/2010に付属しているACEドライバーを使用できます。また、CSVファイルへのOLEDB接続を開き、リーダーを開いてWriteToServerを呼び出すための個別のダウンロードとしても利用できます。

$ServerInstance = "$env:computername\sql1"
$Database = "tempdb"
$tableName = "psdrive"
$ConnectionString = "Server={0};Database={1};Integrated Security=True;" -f $ServerInstance,$Database
$filepath = "C:\Users\Public\bin\"

get-psdrive | export-csv ./psdrive.csv -NoTypeInformation -Force

$connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$filepath`";Extended Properties=`"text;HDR=yes;FMT=Delimited`";"

$qry = 'select * from [psdrive.csv]'

$conn = new-object System.Data.OleDb.OleDbConnection($connString)
$conn.open()
$cmd = new-object System.Data.OleDb.OleDbCommand($qry,$conn) 
$dr = $cmd.ExecuteReader()

$bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $connectionString
$bulkCopy.DestinationTableName = $tableName
$bulkCopy.WriteToServer($dr)

$dr.Close()
$conn.Close()

#CREATE TABLE [dbo].[psdrive](
#   [Used] [varchar](1000) NULL,
#   [Free] [varchar](1000) NULL,
#   [CurrentLocation] [varchar](1000) NULL,
#   [Name] [varchar](1000) NULL,
#   [Provider] [varchar](1000) NULL,
#   [Root] [varchar](1000) NULL,
#   [Description] [varchar](1000) NULL,
#   [Credential] [varchar](1000) NULL,
#   [DisplayRoot] [varchar](1000) NULL
#)
于 2012-10-03T20:42:45.603 に答える