Powershell -join Значения свойств объекта - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь создать переменную, содержащую строку свойств объекта, которые объединяются с "','". Это должно быть передано в SQL условие выбора где. Мой ввод выглядит следующим образом:

foreach ($csv in $CSVFiles) {
$csvOutput = Import-Csv $csv.FullName
$group = $csvOutput | Group-Object order-id, amount-type | Where-Object {$_.Group.'order-id' -ne '' -and $_.Group.'amount-type' -eq 'ItemPrice'}}

В пределах вышеуказанного l oop. Я ищу, чтобы получить идентификатор заказа и передать его в новую переменную $ OrdNum. Я делаю это так:

$OrdNum = $group | Select-Object @{Name='order-id';Expression={$_.Values[0]}}

Чтобы выполнить объединение, которое я попытался:

$OrdNum = ($group | Select-Object  @{Name='order-id';Expression={$_.Values[0]}}) -join "','"

Это дает ',' ',' ',' ',' ', '', '', '', '', '', '', '', 'без значений. Я также пытался:

$OrdNum = ($group | Select-Object -Property 'order-id') -join "','"

, который дает тот же результат.

Я ожидаю, что $ OrdNum будет выглядеть как 12345 ',' 43567 ',' 76334 ',' 23765 et c. Я работаю в предположении, что $ OrdNum требуется в этом формате для передачи на этот SQL запрос:

  $query = “SELECT ARIBH.ORDRNBR AS [ORDER No'],AROBP.IDRMIT AS [RECPT No'], FROM [XXXX].[dbo].[AROBP] FULL JOIN [XXXX].[dbo].[ARIBH] ON [XXXX].[dbo].[AROBP].[IDMEMOXREF] = [XXXX].[dbo].[ARIBH].[IDINVC] where ARIBH.ORDRNBR IN ('$OrdNum')"

Любая помощь по -join очень ценится ИЛИ, если есть альтернативный метод для передачи значения в SQL избегая-присоединения, тогда я открыт для предложений. Большое спасибо.

Спасибо Тео за обновленный код. Это работает как ожидалось. Я также переработал свой существующий пример со следующим. Сохраняя оригинальную группировку, это также работает:

foreach ($csv in $CSVFiles) {
$csvOutput = Import-Csv $csv.FullName -Delimiter "`t"
$group = $csvOutput | Group-Object order-id, amount-type | Where-Object {$_.Group.'order-id' -ne '' -and $_.Group.'amount-type' -eq 'ItemPrice'}
($OrdNum = $csvOutput | Where-Object {![string]::IsNullOrWhiteSpace($_.'order-id')}).'order-id' | Out-Null
$OrdNum = ($OrdNum.'order-id' | Select-Object -Unique) -join "','"
}

1 Ответ

1 голос
/ 22 апреля 2020

Я не совсем уверен, правильно ли я понимаю вопрос, но на самом деле я вообще не вижу необходимости в группировке, когда все, что вам нужно, это массив значений 'order-id', соединенных запятой .

# assuming $CSVFiles is a collection of FileInfo objects
$OrdNum = foreach ($csv in $CSVFiles) {
    # import the csv and output the order numbers that match your where condition
    (Import-Csv -Path $csv.FullName | Where-Object { ![string]::IsNullOrWhiteSpace($_.'order-id') -and $_.'amount-type' -eq 'ItemPrice'}).'order-id'
}

# if needed you can de-dupe the returned arrau with either `$OrdNum | Select-Object -Unique` or `$OrdNum | Sort-Object -Unique`
# join the array elements with a comma to use in your query
$OrdNum = $OrdNum -join ','

В соответствии с вашим комментарием, вам понадобится группировка для других целей позже.

В таком случае что-то подобное может работать для вас:

# create a List object to collect the order-id values
$orders = [System.Collections.Generic.List[string]]::new()

# loop through the CSV files and collect the grouped data in variable $group
$group  = foreach ($csv in $CSVFiles) {
    # import the csv and output objects that match your where condition
    $items = Import-Csv -Path $csv.FullName | Where-Object { ![string]::IsNullOrWhiteSpace($_.'order-id') -and $_.'amount-type' -eq 'ItemPrice'}
    if ($items) {
        # add the 'order-id' values to the list
        $orders.AddRange([string[]]($items.'order-id'))
        # output the grouped items to collect in variable $group
        $items | Group-Object order-id, amount-type
    }
}

# join the elements with a comma to use in your query
$OrdNum = $orders -join ','

PS Вам необходимо использовать [string[]] приведение для метода AddRange(), чтобы избежать исключения: Cannot convert argument "collection", with value: "System.Object[]", for "AddRange" to type "System.Collections.Generic.IEnumerable``1[System.String]": "Cannot convert the "System.Object[] " value of type "System.Object[]" to type "System.Collections.Generic.IEnumerable``1[System.String]"."

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...