所以我有这个输入文件(没有文件扩展名):
0 1 2 3 4 5 ###6#### _7______ 8 9 0 1 2 3 ###4##__
012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456
0202XXXX TESTS1 XX DRN CODE123 010TESTS 0000000001481500000014832000000148150000001481700000014832+
0202XXXX TESTS1 TEST11 DRN CODE123 010TESTS 0000000000336400000003364000000033640000000336400000003364+
0202XXXX TESTS1 XXX YYYYYY PN N2 CODE123 010TESTS 0000000000118500000001206000000011600000000118300000001205+
0202XXXX TESTS1 ZZZZZZZZZ DRN CODE123 010TESTS 0000000004188300000041883000000412400000004156200000041240+
0202XXXX TESTS1 PPP MKLRTR PN CODE123 010TESTS 0000000000000000000000000000000000000000000000000000000000/
0202XXXX TESTS1 GGG TEST ON ED CODE123 010TESTS 0000000000095000000001024000000009500000000098700000001024-
我想从那里获取三个值,并在具有特定格式的新文件上打印。
我正在尝试使用子字符串选项,但我无法按预期在输出文件上看到结果,那么这段代码可能有什么问题?
我希望看到输出为:
1 2 3 4 5
1234567890123456789012345678901234567890123456789012345
CODE123 17.98
CODE12 2.37
CODE 2.70
CODE12 2.73
CODE123 13.39
但是使用以下代码,我得到的结果没有列。一切都在一行中搞砸了。
$InputFile = D:Testinputfile.txt
$outFile = D:Testoutfile.txt
$Pattern = "010TESTS"
$spaces1 = " ";
$spaces2 = " ";
$dot = "."
$rec = 0
(gc $InputFile) | ? {$_.trim() -ne "" } | Select-String -pattern $Pattern -AllMatches | Set-Content $outFile
$file = gc $outFile
$Test = $file.Substring(69, 8) # This should give me the value 010TESTS
foreach ($line in $file) {
if ($Test -eq "010TESTS") {
$Value1 = $file.Substring(57, 8)
$Value2 = $file.Substring(137, 6).TrimStart('0') # To remove leading zeroes
$Value3 = $file.Substring(143, 2)
if (! ($Value1 -eq "" -and $Value2 -eq "00")) {
# Here I need the values on each line
$FinalFile += ($spaces1 + $Value1 + $spaces2 + $Value2 + $dot + $Value3).Split("`n")
}
}
}
$FinalFile | Set-Content $outFile
- 子字符串偏移量与示例数据不匹配
- 要检查偏移量,您应该(至少)暂时插入一个
ruler
- 要用空格填充定义的长度字符串,只需执行
$spaces = " " * 21
- 但是,正如您被告知最好使用
-f
格式字符串进行输出时,请参阅脚本。 - 与其摆弄两个值并插入一个点,不如简单地获取整个范围并除以 100(忽略前导零)
$InputFile = 'D:Testinputfile.txt'
$outFile = 'D:Testoutfile.txt'
$Pattern = "010TESTS"
Get-Content $InputFile | Select-String -Pattern $Pattern | ForEach-Object {
$Line = [string]$_
$Line.Substring(70, 8) #this should give me the value 010TESTS
$Value1 = $Line.Substring(57, 8)
$Value2 = [double]$Line.Substring(137, 8) / 100
if ( $Value1 -and $Value2 ) {
"{0,25}{1,30:N2}" -f $Value1,$Value2 | Out-File $OutFile -Append
}
}
- $_ 包含当前由 Forach-Object 处理的行
- [string] 强制转换(转换)到字符串,这是
.substring
的要求 - 大括号中的第一个数字表示变量跟随
-f
- 逗号后面大括号中的第二个数字表示 var 将抓住的位置(负数表示左对齐,正右对齐)
- 冒号后面是一个格式说明符(参见 Jeff Zeitlin 的链接)N2 表示具有 2 位小数的浮点数。
由于我的区域设置,此示例输出具有十进制逗号。(手动添加标尺)
1 2 3 4 5
1234567890123456789012345678901234567890123456789012345
CODE123 14,83
CODE123 3,36
CODE123 1,20
CODE123 41,24
CODE123 1,02