2016-08-15 4 views
0

필자는 필자의 필자가 PowerShell을 배우면서 돌아 왔으며 필자는 필자의 능력 한계에 부딪혔다. 그래서 누군가가 나를 올바른 방향으로 던져 줄 수 있는지 궁금하거나, 내가하고 싶은 일이 가능하면 나에게 말해 줄 수 있습니까?Powershell CSV to SQL 쿼리

나는 웹에서 많은 수의 파일을 다운로드 한 스크립트를 작성한 후 함께 작업하고자하는 데이터를 제외한 모든 파일을 삭제합니다. 이것들은 .csv의 것입니다 ...

데이터가 다운로드 될 때까지 내가 함께 조종 할 수 있었던 Powershell 코드를 추가했습니다. 이 파일 중 하나의 데이터 추출은 다음과 같습니다.

A 열은

열 B는 ISIN (이것은 작업 정보이다)

열 C 난에 SQL 질의 데이터를 원하는

열 D가 수치도 포함 포함한 설명을 포함

에 반환하면 샘플 데이터에 대한 링크를 찾아주세요 Data Example Data Example

CSV Extract

내가 아마 다른 파일로이 작업을 내보낼 필요가 있다고 생각

Select * 
From CL 
Where CLISIN in ('GB0004835483', 
'BE0003793107', 
'GB00B7V2GY97', 
'GB0000595859', 
'GB00B1VCNQ84', 
'GB0004992003', 
'GB0002369352') 

열 B 내의 데이터에 따라 다음 SQL 명령을 실행 내가 그때 달성하고자입니까? 내 보낸 최종 결과를 사용하지만이 값을이 CSV 파일의 D 열에 배치해야합니다.

나는이 사실을 명확히하기를 바랍니다. 그렇지 않다면 가능한 한 확장시켜야합니다.

필자는 PowerShell을 사용하여 B 열의 각 항목에 대한 쿼리를 자동으로 실행하고 일치하는 쿼리의 결과를 열 D의 상관 행에 추가 할 수 있습니까?

#### DOWNLOAD LOCATIONS #### 
$DownloadPTMLocation = "L:\Operations Database\TakeOverPanel\PTMDisclosureTable.xls" 
$DownloadPTMCSVLocation = "L:\Operations Database\TakeOverPanel\PTMDisclosureTable.csv" 
$DownloadIPTMLocation = "L:\Operations Database\TakeOverPanel\IPTMDisclosureTable.xls" 
$DownloadIPTMCSVLocation = "L:\Operations Database\TakeOverPanel\IPTMDisclosureTable.csv" 

#### WEB URLS ### 
$PTMURL = "http://www.thetakeoverpanel.org.uk/new/disclosureTable/v3/disclosuretable.xls" 
$PTMCSVURL = "http://www.thetakeoverpanel.org.uk/new/disclosureTable/v3/disclosuretable.csv" 
$IPTMURL = "http://irishtakeoverpanel.ie/disclosure/disclosuretable.xls" 
$IPTMCSVURL = "http://irishtakeoverpanel.ie/disclosure/disclosuretable.csv" 

$Path = Get-Location 

#### Load Web Service #### 
$WebClient = New-Object System.Net.WebClient 

#### Start download Process #### 
Write-Host "Downloading PTM File 1 of 4" $Path -ForegroundColor Green 
    $Url = $PTMURL 
    $Path = $DownloadPTMLocation 
    $WebClient.DownloadFile($PTMURL, $DownloadPTMLocation) 

Write-Host "Downloading IPTM File 2 of 3" $Path -ForegroundColor Blue 
    $Url = $IPTMURL 
    $Path = $DownloadIPTMLocation 
    $WebClient.DownloadFile($IPTMURL, $DownloadIPTMLocation) 

Write-Host "Downloading PTM Csv File 3 of 4" $Path -ForegroundColor Gray 
    $Url = $PTMCSVURL 
    $Path = $DownloadPTMCSVLocation 
    $WebClient.DownloadFile($PTMCSVURL, $DownloadPTMCSVLocation) 

Write-Host "Downloading IPTM File 4 of 4" $Path -ForegroundColor Red 
    $Url = $IPTMCSVURL 
    $Path = $DownloadIPTMCSVLocation 
    $WebClient.DownloadFile($IPTMCSVURL, $DownloadIPTMCSVLocation) 



    ##################### 


    ## PTM ## 

#Customise Vars 
$DownloadPTMCSVLocation = "L:\Operations Database\TakeOverPanel\PTMDisclosureTable.csv" 
$OutputPTMCSVLocation = "L:\Operations Database\TakeOverPanel\PTMDisclosureTableb.csv" 
$Match = "ISIN" 
$Matchs = "NSI" 

## Strips all lines that do not contain ISIN ## 

(Get-Content $DownloadPTMCSVLocation) -match $Match | Out-File $OutputPTMCSVLocation 

Remove-Item $DownloadPTMCSVLocation 

Rename-Item $OutputPTMCSVLocation -NewName $DownloadPTMCSVLocation 

(Get-Content $DownloadPTMCSVLocation) -match $Matchs | Out-File $OutputPTMCSVLocation 

Remove-Item $DownloadPTMCSVLocation 

Rename-Item $OutputPTMCSVLocation -NewName $DownloadPTMCSVLocation 

Get-Content $DownloadPTMCSVLocation | % { 
    $_ -replace 'ISIN: ','' 
    } | % { 
    $_ -replace 'NSI: ','' 
    } | Set-Content $OutputPTMCSVLocation 

그래서 더이 작업을 여기에 (한 번 더 SQL 쿼리를 반환) 벽에 충돌 한

내가 여기에 구글을 통해 답도 찾을 수없는이 ... 지금까지 작업 코드는 ...

########### 
## BEGIN ## 
########### 

#### DOWNLOAD LOCATIONS #### 

$DownloadPTMCSVLocation = "L:\Operations Database\TakeOverPanel\PTMDisclosureTable.csv" 
$OutputPTMCSVLocation = "L:\Operations Database\TakeOverPanel\PTMDisclosureTableb.csv" 


#### WEB URLS ### 

$PTMCSVURL = "http://www.thetakeoverpanel.org.uk/new/disclosureTable/v3/disclosuretable.csv" 


$Path = Get-Location 

#### Load Web Service #### 
$WebClient = New-Object System.Net.WebClient 

#### Start download Process #### 


Write-Host "Downloading PTM Csv" $Path -ForegroundColor Gray 
    $Url = $PTMCSVURL 
    $Path = $DownloadPTMCSVLocation 
    $WebClient.DownloadFile($PTMCSVURL, $DownloadPTMCSVLocation) 



##################### 


## PTM ## 

$Match = "ISIN" 
$Matchs = "NSI" 

Import-Csv $DownloadPTMCSVLocation -Header @("A", "ISIN", "NSI", "Output") | #Import the CSV 
    Where { $_.ISIN -like "ISIN: ????????????" -and $_.NSI -like "NSI:*" } | #Filter rows 
    Foreach-Object { 
    $_.ISIN = $_.ISIN.Replace("ISIN: ", "") 
    $_.NSI = $_.NSI.Replace("NSI: ", "") 

    $query = "select CLIALPHASORTCODE, vl2securitynum, sum(cast(vl2beneficial as float)) as beneficial 
    from t5vaultsl2 vl2 left outer join t5client cli 
    on vl2.VL2CLIENTNUM = cli.CLICODE 

    where vl2.vl2securitynum = '$($_.ISIN)' 

    group by CLIALPHASORTCODE, VL2SECURITYNUM" 


##Credentials## 

$MISA = 'xx.xx.x.xx' 
$MISB = 'xx.xx.x.xx' 
$userName = 'UN' 
$PassWord='PW' 
$DB = 'reporting' 


## CREATE MIS CREDENTIALS ## 
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Data Source=$MISA;Initial Catalog=$DB; 
Initial Catalog=$DB;User ID=$userName;Password=$PassWord;" 

## - Runs Script from Set Location 

$SqlCmd = New-Object System.Data.SqlClient.SqlCommand; 
$SqlCMD.CommandText = $query; 
$SqlCmd.Connection = $SqlConnection; 

그래서 스크립트는 ... 다음

#### DOWNLOAD LOCATIONS #### 

$DownloadPTMCSVLocation = "L:\Operations Database\TakeOverPanel\PTMDisclosureTable.csv" 
$OutputPTMCSVLocation = "L:\Operations Database\TakeOverPanel\PTMDisclosureTableb.csv" 
$ExportLocation = "L:\Operations Database\TakeOverPanel\test.csv" 
$ExportLocationb = "L:\Operations Database\TakeOverPanel\test.xml" 


#### WEB URLS ### 

$PTMCSVURL = "http://www.thetakeoverpanel.org.uk/new/disclosureTable/v3/disclosuretable.csv" 
$Path = Get-Location 


#### Load Web Service #### 
$WebClient = New-Object System.Net.WebClient 

#### Start download Process #### 


Write-Host "Downloading PTM Csv" $Path -ForegroundColor Gray 
    $Url = $PTMCSVURL 
    $Path = $DownloadPTMCSVLocation 
    $WebClient.DownloadFile($PTMCSVURL, $DownloadPTMCSVLocation) 



################ 
#### Query #### 
################ 

$query = @" 
    select CLIALPHASORTCODE, vl2securitynum, sum(cast(vl2beneficial as float)) as beneficial 
    from t5vaultsl2 vl2 left outer join t5client cli 
    on vl2.VL2CLIENTNUM = cli.CLICODE 

    where vl2.vl2securitynum = '$($_.ISIN)' 

    group by CLIALPHASORTCODE, VL2SECURITYNUM 
"@; 


##################################### 

$Match = "ISIN" 
$Matchs = "NSI" 

## Prepare SQL ## 

$MISA = 'xx.xx.x.xx' 
$MISB = 'xx.xx.x.xx' 
$userName = 'UN' 
$PassWord='PW' 
$DB = 'reporting' 


## CREATE SQL Connection ## 
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Data Source=$MISA;Initial Catalog=$DB;Initial Catalog=$DB;User ID=$userName;Password=$PassWord;" 
$SqlConnection.Open() 

# Put everything in a Try block so if there is an error the SQL 
# connection is still closed 
try 
{ 
    $SqlCmd = $SqlConnection.CreateCommand() 

    ## Process CSV ## 

    Import-Csv $DownloadPTMCSVLocation -Header @("A", "ISIN", "NSI", "Output") | #Import the CSV 
     Where { $_.ISIN -like "ISIN: ????????????" -and $_.NSI -like "NSI:*" } | #Filter rows 
     Foreach-Object { 
     $_.ISIN = $_.ISIN.Replace("ISIN: ", "") 
     $_.NSI = $_.NSI.Replace("NSI: ", "") 

     # Get data from SQL 
     $query = "select CLIALPHASORTCODE, vl2securitynum, sum(cast(vl2beneficial as float)) as beneficial from t5vaultsl2 vl2 left outer join t5client cli on vl2.VL2CLIENTNUM = cli.CLICODE where vl2.vl2securitynum = '$($_.ISIN)' group by CLIALPHASORTCODE, VL2SECURITYNUM" 

     $SqlCmd.CommandText = $query 
     $result = $SqlCmd.ExecuteReader() 
     $table = New-Object "System.Data.DataTable" 
     $table.Load($result) 

     $t = $table.Vl2Beneficial 

     # Pass row on through the pipeline 
     $_.Output = $table.VL2Beneficial 

     $table | Export-Clixml $ExportLocationb 

     Write-Output $_ 
    } | Export-Csv $OutputPTMCSVLocation -NoTypeInformation 
} 
finally 
{ 
    # Always close SQL connection even if error is encountered. 
    $SqlConnection.Close() 
} 
+0

CSV 파일의 데이터를 제공하십시오 (스크린 샷이 아님). CSV에서 얻으려는 결과물은 무엇입니까? 이 CSV, 결정 구조와 함께 OPENROWSET을 사용하여 SQL Server 측에서이 파일의 데이터를 읽을 수 있습니다. – gofr1

+0

PTM 파일은 제공된 링크에서 다운로드 할 수 있습니다. –

+0

안녕 Deadly_Bagel 예, 다운로드 할 수 있으며 내 코드에서 내가하고있는 일은 내가 보유하고있는 PTM 파일을 비교하려고하는 것입니다. 어느 곳에서 SQL 요구 사항이 들어 왔습니까? Gofr1, 필요한 변경 사항이 추가되었습니다. 신뢰하고 있습니다 ... D 열 내에서 얻으려는 출력은 숫자 위치입니다. –

답변

1
## PTM ## 

$Match = "ISIN" 
$Matchs = "NSI" 

## Prepare SQL ## 

$MISA = 'xx.xx.x.xx' 
$MISB = 'xx.xx.x.xx' 
$userName = 'UN' 
$PassWord='PW' 
$DB = 'reporting' 

## CREATE SQL Connection ## 
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Data Source=$MISA;Initial Catalog=$DB;Initial Catalog=$DB;User ID=$userName;Password=$PassWord;" 
$SqlConnection.Open() 

# Put everything in a Try block so if there is an error the SQL 
# connection is still closed 
try 
{ 
    $SqlCmd = $SqlConnection.CreateCommand() 

    ## Process CSV ## 

    Import-Csv $DownloadPTMCSVLocation -Header @("A", "ISIN", "NSI", "Output") | #Import the CSV 
     Where { $_.ISIN -like "ISIN: ????????????" -and $_.NSI -like "NSI:*" } | #Filter rows 
     Foreach-Object { 
     $_.ISIN = $_.ISIN.Replace("ISIN: ", "") 
     $_.NSI = $_.NSI.Replace("NSI: ", "") 

     # Get data from SQL 
     $query = "select CLIALPHASORTCODE, vl2securitynum, sum(cast(vl2beneficial as float)) as beneficial from t5vaultsl2 vl2 left outer join t5client cli on vl2.VL2CLIENTNUM = cli.CLICODE where vl2.vl2securitynum = '$($_.ISIN)' group by CLIALPHASORTCODE, VL2SECURITYNUM" 

     $SqlCmd.CommandText = $query 
     $result = $SqlCmd.ExecuteReader() 
     $table = New-Object "System.Data.DataTable" 
     $table.Load($result) 

     # Pass row on through the pipeline 
     $_.Output = $table.VL2Beneficial 

     Write-Output $_ 
    } | Export-Csv $OutputPTMCSVLocation -NoTypeInformation 
} 
finally 
{ 
    # Always close SQL connection even if error is encountered. 
    $SqlConnection.Close() 
} 
지금처럼3210

기본적으로 모든 파일 이름 바꾸기가 완전히 불필요하므로 (필요한 경우 해당 종류의 변수 사용) Import-Csv는 각 행마다 하나씩 개체 배열을 반환하므로 필터를 파이프 처리합니다. 여기서 ISIN은 12 자로 만 검사 됨) 데이터를 정렬하여 루프합니다.

+0

Deadly-Bagel에 대한 엄청난 명성! 훌륭한 작업, 모든 도움을 주셔서 감사합니다 ... –

+0

채팅에서 다시 뭔가를 떨어 뜨리고 ... 나에게 실망스런 지식의 나의 거대한 부족으로 출력 및 다시 SQL을 얻으려고 노력 ... 나는 아무것도 돌려 보낼 수 있습니다 D 열 또는 SQL 쿼리에 있지만 sql 쿼리의 결과는 아닙니다 ... –

+0

마지막 요소 인 System.Object []가 결과로 반환되면서 내보내기 오류가 발생합니다. 모든 생각 ... 필요한 경우 코드를 전체 업데이트로 보낼 수 있습니까? –