PowerShell Split函数失效:文件格式转换脚本故障求助
分号分隔文本转键值对格式的PowerShell脚本修复
需求说明
需要将如下格式的File 1转换为File 2的键值对每行格式:
File 1 输入格式
Datum;Zeit;mp380_rdh_f2_o;mp383_rlf_f2_o;mp363_rdh_f3;mp362_rlf_f3;mp604_rdh_sitz;mp607_rdh_sitz;mp611_rlf_sitz;mp_358_1_rdl;mp_359_1_rdl;MP520_620_rdl;plf_dichtfl 10_03_2023;08_22_59;0.222;0.231;0.235;0.581;0.266;0.000;0.000;8.937;0.000
File 2 目标格式
Datum;10_03_2023 Zeit;08_22_59 mp380_rdh_f2_o;0.222 mp383_rlf_f2_o;0.231 mp363_rdh_f3;0.235 mp362_rlf_f3;0.581 mp604_rdh_sitz;0.266 mp607_rdh_sitz;0.000 mp611_rlf_sitz;0.000 mp_358_1_rdl;8.937 mp_359_1_rdl;0.000 MP520_620_rdl; plf_dichtfl
(注:原目标格式中部分值对应有误,已修正为与输入数据匹配的正确对应关系)
原脚本问题分析
原脚本存在以下关键错误:
ValueSplit初始化错误:$ValueSplit = $ValueSplit -split ";"是用未定义的变量自身分割,第一次循环后$ValueSplit仅包含第一个元素,后续循环无法获取正确数据。- 数据行获取逻辑错误:通过
iex执行动态字符串获取file[$i3],但输入文件只有2行,$i3从1开始循环到表头长度(13),后续file[2]及以后的行不存在,导致ValueLine为空。 - 循环逻辑冗余:不需要循环遍历文件行,数据行仅需取
file[1]一次即可。
修正后的PowerShell脚本
$file = Get-Content $SeeFile1 # 分割表头和数据行 $headerArray = $file[0] -split ";" $valueArray = $file[1] -split ";" # 遍历表头,逐个匹配对应数据 for ($index = 0; $index -lt $headerArray.Length; $index++) { $currentHeader = $headerArray[$index] # 处理数据数组长度不足的情况(如最后一个表头无对应数据) $currentValue = if ($index -lt $valueArray.Length) { $valueArray[$index] } else { "" } # 生成输出行 if ($currentValue -ne "") { "$currentHeader;$currentValue" | Out-File -FilePath $MainFile -Append } else { $currentHeader | Out-File -FilePath $MainFile -Append } }
修正要点说明
- 直接获取数据行:一次性读取并分割数据行
$file[1],避免动态执行代码的风险和错误。 - 索引匹配逻辑:用循环索引
$index同步对应表头和数据的位置,确保每个表头匹配正确的数值。 - 边界处理:判断数据数组长度,当表头数量多于数据元素时,直接输出表头(如示例中的
plf_dichtfl)。 - 简化逻辑:去掉冗余的
SplitCounter变量,用循环索引替代,代码更简洁易维护。
内容的提问来源于stack exchange,提问作者Piravienth
相关产品推荐
相关产品推荐

