【问题标题】:Format table from output of a string从字符串的输出格式化表格
【发布时间】:2018-07-04 15:51:04
【问题描述】:

我尝试了不同的方法,但无法将数据格式化为表格

$str1 = "First string"
$str2 = "Sec string"
$str3 = "third str"
$str4 = "fourth string"

$str = "$str1 $str2 `r`n"
$str+= "$str3 $str4"

write-host $str | Format-Table

我希望创建如下输出:

First string  Sec string 
third str     fourth string

【问题讨论】:

    标签: powershell format tabular


    【解决方案1】:

    为了按预期使用Format-Table,您需要具有属性的对象,而不仅仅是字符串:

    $str -split "`r`n" | ForEach-Object {
        # Initialize a custom object whose properties will reflect 
        # the input line's tokens (column values).
        $obj = New-Object PSCustomObject; $i = 0
        # Add each whitespace-separated token as a property.
        foreach ($token in -split $_) {
          Add-Member -InputObject $obj -NotePropertyName ('col' + ++$i) -NotePropertyValue $token
        }
        # Output the custom object.
        $obj
      } | Format-Table -HideTableHeaders
    
    • $str -split "`r`n" 将多行字符串拆分为单独的行,并通过管道将它们一一发送。

    • ForEach-Object 命令从每一行构造一个自定义对象,其属性是该行上以空格分隔的标记,如 cmets 中所述;属性名称(与输出无关)会自动生成为 col1col2、...

      • 注意:这 not 与您想要的输出完全匹配,因为 每个 空间(空格运行)是视为分隔符。如果您想将原始 $str1$str2、... 变量值(例如,First string)分别视为 单个列值,则必须使 关于如何标记线的假设
        例如,如果假设 2 个连续的单词形成一个值,请将上面的 -split $_ 替换为 $_ -split '(\w+ \w+) ?' -ne ''

      • 如果您不想依赖假设,则必须使用嵌入式引用构造输入字符串 以便明确指示标记边界(然后必须修改代码以正确解析嵌入的引用)。

    • Format-Table 然后以表格形式显示自定义对象,列正确对齐; -HideTableHeaders 隐藏标题行(自动生成的属性名称)。

    使用您的示例输入,上面会产生以下结果,没有 -HideTableHeaders 以便更好地说明代码的作用:

    col1  col2   col3   col4
    ----  ----   ----   ----
    First string Sec    string
    third str    fourth string
    

    同上,但使用 2 个连续的单词拆分逻辑:

    col1         col2
    ----         ----
    First string Sec string
    third str    fourth string
    

    至于你尝试了什么:

    • 不要使用Write-Host 来产生数据 输出:Write-Host 输出(默认情况下)进入控制台绕过管道,这样Format-Table 就没有收到任何输入,在这里也不起作用。

    • 也就是说,即使Format-Table 确实接收输入(通过使用 $str 本身,没有 Write-Host,即:$str | Format-Table ),它对 字符串 没有(可见的)影响,总是按原样呈现

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-06
      • 2018-01-01
      • 1970-01-01
      • 2012-01-04
      相关资源
      最近更新 更多