Powershell : streamreader 주위에 IdataReader 래퍼 구현

idatareader powershell sqlbulkcopy streamreader

문제

PowerShell을 사용하여 SQL Server에 매우 큰 CSV 파일을로드하려고합니다. 이 코드는 파리 정규 표현식 대체에 적용해야하며 다양한 구분 기호, EOR 및 EOF 표시를 허용해야합니다. 유지 보수를 위해 어셈블리를 가져 오지 않고 Powershell에이 논리가 모두 존재하기를 바랍니다.

효율적이기 위해서는 SQLBulkCopy 메서드를 사용해야한다는 것을 알고 있습니다. 그러나 모든 Powershell 예제는 DataTable을 채우고 전달하므로 파일 크기로 인해 불가능합니다.

Idataareader에서 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.')

도와 줘서 고마워.

인기 답변

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
#)


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.