如何从数组中删除 space (powershell)
How to remove space from an array (powershell)
我有一个脚本可以读取 TAB 分隔的 .TXT 文件并从 table 中获取信息,然后根据列表中的名称创建一个 .SQL 脚本。但每次调用 $Variable[#] 时,它都会添加一个额外的 space。
此 space 在源数据中不存在。我正在寻找修剪它的方法。
$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] 或任何其他数字时,它都会添加一个 space。这不好,因为这会为它在我的数据库中提取的每个名称创建一个重复的条目。
我们有一个现有的“.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 ','~ ','~ ') )
在您的字符串构建中使用逗号是造成此问题的原因。我看到您也在该字符串的末尾使用 -join
。这可以解释为什么您使用逗号,因为 -join
是数组运算符。本质上,通过将字符串与基本字符串连接相结合,您正在混淆构建字符串的方式。一个显示问题的简单示例(对代码进行少量重构以实现目标)
'"+$myarray[2].,"',"+$myarray[1],"',"+$myarray[3],"'
解决这些问题,您的问题就会消失(请参阅下面有关更好方法的部分)。该逗号使 PowerShell 将下一个字符串作为数组的一部分,就像字符串连接一样。当数组在 PowerShell 中被展平为字符串时,元素是 space 分隔的。 问题不在于数组元素中的 space,而是您如何构建字符串。
比较这些结果,看看我的意思
$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 注入,因为这超出了问题的范围。
我有一个脚本可以读取 TAB 分隔的 .TXT 文件并从 table 中获取信息,然后根据列表中的名称创建一个 .SQL 脚本。但每次调用 $Variable[#] 时,它都会添加一个额外的 space。 此 space 在源数据中不存在。我正在寻找修剪它的方法。
$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] 或任何其他数字时,它都会添加一个 space。这不好,因为这会为它在我的数据库中提取的每个名称创建一个重复的条目。
我们有一个现有的“.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 ','~ ','~ ') )
在您的字符串构建中使用逗号是造成此问题的原因。我看到您也在该字符串的末尾使用 -join
。这可以解释为什么您使用逗号,因为 -join
是数组运算符。本质上,通过将字符串与基本字符串连接相结合,您正在混淆构建字符串的方式。一个显示问题的简单示例(对代码进行少量重构以实现目标)
'"+$myarray[2].,"',"+$myarray[1],"',"+$myarray[3],"'
解决这些问题,您的问题就会消失(请参阅下面有关更好方法的部分)。该逗号使 PowerShell 将下一个字符串作为数组的一部分,就像字符串连接一样。当数组在 PowerShell 中被展平为字符串时,元素是 space 分隔的。 问题不在于数组元素中的 space,而是您如何构建字符串。
比较这些结果,看看我的意思
$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 注入,因为这超出了问题的范围。