Как убрать пространство из массива (powershell) - PullRequest
0 голосов
/ 10 мая 2018

У меня есть сценарий, который читает отдельный TAB-файл TAB и получает информацию из таблицы, а затем создает сценарий .SQL на основе имен в списке.Но каждый раз, когда вызывается переменная $ #, она добавляет дополнительный пробел.Это пространство не существует в исходных данных.Я ищу метод обрезки.

$start | Out-File -filepath $target1 -append

$infile = $source1
$reader = [System.IO.File]::OpenText($infile)
$writer = New-Object System.IO.StreamWriter $file1;

$counter = 1
try {
    while (($line = $reader.ReadLine()) -ne $null)
    {
        $myarray=$line -split "\t" | foreach {$_.Trim()}
If ($myarray[1] -eq "") {$myarray[1]=”~”}
If ($myarray[2] -eq "") {$myarray[2]=”~”}
If ($myarray[3] -eq "") {$myarray[3]=”~”}
If ($myarray[4] -eq "") {$myarray[4]=”~”}
If ($myarray[5] -eq "") {$myarray[5]=”~”}
        if ($myarray[0] -Match "\d{1,4}\.\d{1,3}"){
"go
Insert into #mytable Select convert(varchar(60),replace('OSFI Name: "+$myarray[1],$myarray[2],$myarray[3],$myarray[4],$myarray[5],"')), no_,branch,name,surname,midname,usual,bname2 
from cust where cust.surname in ('"+$myarray[2].,"',"+$myarray[1],"',"+$myarray[3],"',"+$myarray[4],"',"+$myarray[5],"')'  and ( name in ('"+$myarray[1],"','"+$myarray[2],"','"+$myarray[3],"','"+$myarray[4],"','"+$myarray[5],"') or
midname in ('"+$myarray[1],"','"+$myarray[2],"','"+$myarray[3],"','"+$myarray[4],"','"+$myarray[5],"') or
usualy in ('"+$myarray[1],"','"+$myarray[2],"','"+$myarray[3],"','"+$myarray[4],"','"+$myarray[5],"') or
bname2 in ('"+$myarray[1],"','"+$myarray[2],"','"+$myarray[3],"','"+$myarray[4],"','"+$myarray[5],"') )
" -join "," | foreach {$_.Trim()} | Out-File -filepath $target1 -append


        }


            #$writer.WriteLine($original);

            #Write-Output  $original;
            #Write-Output  $newlin
    }
}
finally {
    $reader.Close()
    $writer.Close()
}

$end | Out-File -filepath $target1 -append

Каждый раз, когда он вызывает $ myarray [1] или любое другое число, он добавляет пробел.Это не хорошо, так как это создаст дублирующую запись для каждого имени, которое он извлекает в моей БД.

У нас есть существующий скрипт ".Java", который делает то, что я пытаюсь достичь, поэтому я знаю, что должен выводитьвыглядит так.

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

go

Insert into #mytable Select convert(varchar(60),replace('OSFI Name: Fake Name Faker unreal   ','''''','''')), no_,branch,name,surname,midname,usual,bname2 
from cust where cust.surname in ('Faker unreal','Fake Name','~','~','~') and ( name in ('Fake Name', 'Faker unreal', '~', '~', '~') or 
midname in ('Fake Name', 'Faker unreal', '~', '~', '~') or 
usual in ('Fake Name', 'Faker unreal', '~', '~', '~') or 
bname2 in ('Fake Name', 'Faker unreal', '~', '~', '~') ) 

Но вместо этого я получаю

go
Insert into #mytable Select convert(varchar(60),replace('OSFI Name: Fake Name Fake Faker unreal ~ ~ ')), no_,branch,name,surname,midname,usual,bname2 
from cust where cust.surname in ('Fake Name ',unreal ',~ ',~ ')'  and ( name in ('Fake Name ','Fake Faker ','unreal ','~ ','~ ') or
midname in ('Fake Name ','Fake Faker ','unreal ','~ ','~ ') or
usualy in ('Fake Name ','Fake Faker ','unreal ','~ ','~ ') or
bname2 in ('Fake Name ','Fake Faker ','unreal ','~ ','~ ') )

1 Ответ

0 голосов
/ 10 мая 2018

Использование запятых в построении строк вносит свой вклад в эту проблему.Я вижу, что вы также используете -join в конце этой строки.Это может объяснить, почему вы использовали запятые, поскольку -join является оператором массива.По сути, вы путаете воду в том, как вы строите свою струну, сочетая ее с базовой конкатенацией струн.Простой пример, который показывает проблему (незначительный рефакторинг вашего кода для достижения цели)

'"+$myarray[2].,"',"+$myarray[1],"',"+$myarray[3],"'

Исправьте это, и ваша проблема должна исчезнуть (см. Раздел ниже о лучших подходах).Эта запятая заставляет PowerShell принимать следующую строку как часть массива, как предполагается для строки concat.Когда в PowerShell массивы сливаются со строками, элементы разделяются пробелами. Проблема не в пробелах в элементе массива, а в том, как вы строите свою строку.

Сравните эти результаты, чтобы понять, что я имею в виду

$myarray = 65..90 | %{[string]([char]$_) * 4}

"'"+$myarray[2],"'"
"'"+$myarray[2]+"'"

'CCCC '
'CCCC'

В первомпример вывода 2-х элементный массив $myarray[2],"'" добавляется в строку "'".Во втором кавычка, затем элемент массива добавляется к строке, а затем еще одна кавычка.Чистая конкатенация строк.


Рассмотрим лучшие подходы к построению строк

Знайте, что есть и другие способы сделать это.Вы можете использовать подвыражения и оператор форматирования, если это поможет.

"'$($myarray[2])','$($myarray[3])'"
"'{0}','{1}'" -f $myarray[2],$myarray[3]

Предупреждение о внедрении SQL

Вы строите вручную с конкатенацией строк, SQL-кодом.Это означает, что атакованный пользователь может поместить что-то вредоносное во входной файл, и вы вполне можете выполнить это.Вы должны использовать параметризацию команды.Посмотрите на SQL-инъекцию, поскольку это выходит за рамки вопроса.

...