新文件作为输出 - 如何在PowerShell中创建它



所以我有这个输入文件(没有文件扩展名):

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

最新更新