Разделение значений с помощью Powershell - PullRequest
0 голосов
/ 10 марта 2020

У меня есть файл с несколькими выражениями, такими как «$ REGX (« CareMedi c .2_0 »,« CustomerInformation »,« Customer Information »)». Файл может быть xml файл, текстовый файл или любой другой тип. Если файл содержит 9 из этих выражений, я пытаюсь извлечь все девять и отправить значения в базу данных.

Я попробовал свой код, как показано ниже:

 $input_path = ‘C:\Users\Administrator\Desktop\test2.xml’

$SQLServer = "WIN-17V7QT0IJVK"
$SQLDBName = "Test"
$uid ="WIN-17V7QT0IJVK\Administrator"
$pwd = "letmebackinplease"
$SqlQuery = "SELECT * from product_schema;"
$ConnectionString = "Server = $SQLServer; Database = $SQLDBName; Integrated Security = True;"

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection $ConnectionString
$SqlConnection.open() 

if($SqlConnection.state -eq "Open"){
    Write-Host "Test connection successful"


}

$regex =  '()\(.*?\)'
$output = select-string -Path $input_path -Pattern $regex -AllMatches | % { $.Matches } | % { $.Value } |
ForEach-Object {
        ($_ -split "\(|\)")[1]
    }

foreach ($line in $output){
        $line = $line -replace "\(",""
        $line = $line -replace "\)",""
        $line = $line -replace "\'",""
        $col1,$col2,$col3 = $line -split ","
        [PSCustomObject]@{
            col1 = $col1
            col2 = $col2
            col3 = $col3
            } | select col1,col2,col3

        $insert_query = "INSERT INTO [$SQLDBName].[dbo].[product_schema]
           ([version]
           ,[field]
           ,[value])
     VALUES
          ($col1, $col2, $col3);" 

         $execute_query = New-Object System.Data.SqlClient.SqlCommand
         $execute_query.connection = $SQLConnection
         $execute_query.commandtext = $insert_query
         $execute_query.ExecuteNonQuery()

}

$SqlConnection.close()

Если файл имеет два из следующих:

('Medic.2_0','AgeInformation','Age Information')
('Medic.2_0','TransactionID','Transaction ID')

Мой фактический вывод должен быть:

'Medic.2_0' stored in Version Column
'AgeInformation' stored in the Field Column
'Age Information' stored in the value column

'Medic.2_0' stored in Version Column
'TransactionID' stored in the Field Column
'Transaction ID' stored in the value column

Я должен взять каждое из значений и сохранить его в столбце во временной таблице Настройка на MySQL сервере, как показано ниже:

**Version**          **Field**            **Value**

Medic.2_0   AgeInformation      Age Information
Medic.2_0   TransactionID       Transaction ID

Обнаружена ошибка:

Exception calling "ExecuteNonQuery" with "0" argument(s): "Incorrect syntax near '.2'."
At C:\Users\Administrator\Desktop\test.ps1:47 char:10
+          $execute_query.ExecuteNonQuery()
+          ~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : SqlException

Может кто-нибудь порекомендует, как мне изменить свой код для решения этой проблемы?

Ответы [ 2 ]

1 голос
/ 10 марта 2020

В ответ на ваш исходный вопрос перед редактированием: при условии, что ваш вывод выглядит следующим образом и сохраняется в переменной с именем $output

('Medi c .2_0', 'AgeInformation', 'Age Информация ')
(' Medi c .2_0 ',' TransactionID ',' ID транзакции ')

Попробуйте это:

foreach ($line in $output){
        $line = $line -replace "\(",""
        $line = $line -replace "\)",""
        $line = $line -replace "\'",""
        $col1,$col2,$col3 = $line -split ","
        [PSCustomObject]@{
            col1 = $col1
            col2 = $col2
            col3 = $col3
            } | select col1,col2,col3 | export-csv d:\test.csv -append -NoTypeInformation
        }

Мы перебираем $output строка за строкой удаляет скобки и одинарные кавычки, разбивая оставшийся текст на запятую, затем назначая каждую из трех записей в соответствующие переменные. Как только они находятся в переменных, мы можем легко создать PSObject и использовать его для выбора наших требований для export-csv

0 голосов
/ 10 марта 2020

Попробуйте добавить этот код:

$info=@() #for store your values

foreach($item in $output){
$z=$item.split(',') #for split to 3 strings
$info+=[PSCustomObject]@{ #create custom object which have named columns and store our values
            Version = $z[0]
            Field = $z[1]
            Value = $z[2]
            }

}
Write-Output $info #variable that store all columns

Затем вы должны выполнить foreach l oop для каждого объекта в $info. вы можете запустить его так:

foreach($data in $info){
$data.Version #to access Version field
$data.Field   #to access Field field
$data.Value   #to access Value field
.......your SQL query......
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...