You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动