PowerShell数组去空格问题:调用数组变量自动加空格的解决方法
解决PowerShell处理TSV生成SQL时数组元素自动添加空格的问题
我看了你遇到的问题——用PowerShell读取制表符分隔的TXT文件生成SQL脚本时,数组元素总是莫名多了个空格,导致SQL里的字符串带多余空格,进而产生重复条目。这个问题其实是PowerShell的字符串拼接语法导致的,咱们一步步来修复:
问题根源分析
你的代码里已经用了$line -split "\t" | foreach {$_.Trim()}来去除元素前后的空格,这一步是对的。但字符串拼接时误用了逗号,比如这段:
"go Insert into #mytable Select convert(varchar(60),replace('OSFI Name: "+$myarray[1],$myarray[2],$myarray[3],$myarray[4],$myarray[5],"')), ..."
在PowerShell中,逗号会把多个变量/字符串变成数组,当数组被隐式转换成字符串时,PowerShell默认用空格分隔数组元素,这就是你看到的额外空格的来源!另外你的代码还有几个小语法错误:比如$myarray[2].多了个点,usualy拼写错误(应该和期望输出里的usual一致),还有SQL单引号的转义逻辑也有问题。
修复方案
1. 改用字符串插值(推荐)
PowerShell的字符串插值($())能更清晰地拼接变量,避免数组展开带来的空格。同时用Here-String(@")来写多行SQL,可读性更强。
2. 修正语法错误和SQL转义
把拼写错误的usualy改成usual,用Replace("'", "''")来正确转义SQL里的单引号(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-Object { $_.Trim() } # 替换空值为~ for ($i=1; $i -le 5; $i++) { if ([string]::IsNullOrEmpty($myarray[$i])) { $myarray[$i] = "~" } } # 匹配目标行(数字格式:xxx.xx) if ($myarray[0] -match "\d{1,4}\.\d{1,3}") { # 构建OSFI名称,转义单引号 $osfiName = "OSFI Name: $($myarray[1]) $($myarray[2]) $($myarray[3]) $($myarray[4]) $($myarray[5])".Replace("'", "''") # 用Here-String拼接SQL,避免空格问题 $sqlLine = @" go Insert into #mytable Select convert(varchar(60),replace('$osfiName', '''', '''''')), 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 usual in ('$($myarray[1])','$($myarray[2])','$($myarray[3])','$($myarray[4])','$($myarray[5])') or bname2 in ('$($myarray[1])','$($myarray[2])','$($myarray[3])','$($myarray[4])','$($myarray[5])') ) "@ # 写入文件 $sqlLine | Out-File -filepath $target1 -append } } } finally { $reader.Close() $writer.Close() } $end | Out-File -filepath $target1 -append
关键修改点说明
- 用
for循环简化了空值替换逻辑,更简洁 - 用
$()在字符串插值中引用数组元素,避免逗号导致的数组展开 - 用Here-String(
@")编写多行SQL,避免拼接时的语法混乱 - 修正了
usualy的拼写错误和$myarray[2].的语法错误 - 正确处理了SQL单引号的转义,确保生成的SQL语法正确
这样修改后,生成的SQL就不会有额外的空格,和你期望的输出一致了。
内容的提问来源于stack exchange,提问作者Cleadus Fetus




