【问题标题】: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 中所述;属性名称(与输出无关)会自动生成为 col1、col2、...
注意:这 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
至于你尝试了什么: