【问题标题】:New file as output - how to create it in PowerShell新文件作为输出 - 如何在 PowerShell 中创建它
【发布时间】:2017-05-09 19:38:03
【问题描述】:

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

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-

我想从那里获取三个值并打印在具有特定格式的新文件上。

我正在尝试使用 substring 选项,但我无法在输出文件中看到预期的结果,那么这段代码可能有什么问题?

我希望看到的输出为:

         1         2         3         4         5
1234567890123456789012345678901234567890123456789012345
                 CODE123                          17.98
                 CODE12                            2.37
                 CODE                              2.70
                 CODE12                            2.73
                 CODE123                          13.39

但是使用下面的代码,我得到的结果没有列。一行代码都搞砸了。

$InputFile = D:\Test\inputfile.txt
$outFile = D:\Test\outfile.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

【问题讨论】:

  • $file(输入数组)和$File(输出字符串)是否应该是不同的变量? PowerShell 不区分大小写。
  • 如果您需要固定格式的输出文件,我强烈建议您探索-f operator
  • 另外,您只需在循环外设置一次$Test。因为它的值在循环内永远不会改变,if() 每次都采用相同的分支。
  • 很好@Ryan Bemrose,刚刚修复了变量名称。嗯,会看看你提到的$Test,谢谢。
  • 在创建输出文件时,您不能将D:\Test 作为输入文件,同时将D:\Test 作为目录

标签: powershell formatting output


【解决方案1】:
  • 您的子字符串偏移量与您的示例数据不匹配
  • 要检查偏移量,您应该(至少)临时插入ruler
  • 用空格填充定义长度的字符串只需执行$spaces = " " * 21
  • 但正如您所说,最好使用-f 格式字符串进行输出,请参阅脚本。
  • 无需摆弄两个值并插入一个点,只需获取整个范围并除以 100(忽略前导零)

$InputFile = 'D:\Test\inputfile.txt'
$outFile =   'D:\Test\outfile.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's link),N2 表示带有 2 位小数的浮点数。

由于我的语言环境,此示例输出包含十进制逗号。 (标尺手动添加)

         1         2         3         4         5     
1234567890123456789012345678901234567890123456789012345
                 CODE123                          14,83
                 CODE123                           3,36
                 CODE123                           1,20
                 CODE123                          41,24
                 CODE123                           1,02

【讨论】:

  • LotPings 非常感谢您提供的宝贵提示,我不太了解 -f 格式但必须学习,那么这段代码中的确切含义是什么? "{0,25}{1,30:N2}" 这部分我也没看懂,它是做什么的? $Line = [字符串]$_
  • 为您的问题添加了一些 cmets。
  • 完美!现在一切都说得通了,再次感谢您的解释,帮助了很多人。
猜你喜欢
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 2017-08-21
  • 2019-02-17
  • 2019-10-13
  • 1970-01-01
相关资源
最近更新 更多