Powershell固定宽度导出

Powershell固定宽度导出,powershell,powershell-2.0,fixed-width,Powershell,Powershell 2.0,Fixed Width,我有一个文本文件,它使用固定宽度分隔列 我正在加载文件并创建一个包含前两列值的新列。 我的问题是,在导出数据时,我需要为C列定义一个固定的列宽13 Column A (3) Column B(9) Column C(13) MMA 12345 12345_MMA MMO 987222 987222_MMO 基本上,对于导出中的这个示例,第一行缺少4个空格,第二行缺少3个空格 这是我当前的代码,其中还包括用于创建M

我有一个文本文件,它使用固定宽度分隔列

我正在加载文件并创建一个包含前两列值的新列。 我的问题是,在导出数据时,我需要为C列定义一个固定的列宽13

Column A (3)   Column B(9)   Column C(13)
MMA            12345         12345_MMA
MMO            987222        987222_MMO
基本上,对于导出中的这个示例,第一行缺少4个空格,第二行缺少3个空格

这是我当前的代码,其中还包括用于创建MD5的新行

    # Load input data
$PreSystem = [IO.File]::ReadAllText("C:\FILE.txt")

# Initiate md5-hashing
$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$utf8 = new-object -TypeName System.Text.UTF8Encoding

# Split input data by lines
$all = $PreSystem.split("`n") 

# Loop over lines
for($i = 0; $i -lt $all.length-1; $i += 1) {
  # Access distinct lines
  $entry = "$($all[$i])"
  # Get the different parameters
  $market_code = $entry.substring(1,3)
  $soc = $entry.substring(4,9)
  # Hash the SOC element
  $hash = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes($soc)))
  # Create desired format for each entry
  $output = $hash.Replace("-","")+$soc.Replace(" ","") + "_" + $market_code + $all[$i]
  # Write to file
  "$output" | Out-File -Filepath C:\"C:\FILE.txt" -Append -encoding ASCII

}

提前感谢

其中一个解决方案是针对每一行,在连接时使用此机制:

$a = "MMA"
$b = "12345"

$str = "$($b)_$($a)"

if (($str.Length) -ge 13 ) {
    Write-Host "$($str)"
} else {
    $padStr = " " * (13 - ($str.Length))
    Write-Host  "$($str)$($padStr)"
} 
因此,您可以根据自己的目的使用适当的CmdLet,而不是Write-Host CmdLet

添加实际代码后进行编辑。因此,上述逻辑将转化为:

$market_code = $entry.subString(1,3)
$soc = $entry.subString(4,9)

$str = $soc.Replace(" ", "") + "_" + $market_code

if (($str.Length) -ge 13 ) {
    $output = $hash.Replace("-","") + $str + $all[$i]
} else {
    $padStr = " " * (13 - ($str.Length))
    $output = $hash.Replace("-","") + $str + $padStr + $all[$i]

} 

您可以使用提示创建自定义表格格式。下面是一个
获取过程
的示例:

$a = @{Expression={$_.Name};Label="Process Name";width=25}, `
@{Expression={$_.ID};Label="Process ID";width=15}, `
@{Expression={$_.MainWindowTitle};Label="Window Title";width=40}

Get-Process | Format-Table $a
基本上,您可以通过
Format Table
will管道构建一个表达式
每行。您不必为每一行自行设置格式,而是构建一个哈希并通过管道将其传递到Format表。

我仍然不太清楚您实际想要实现什么输出,但这可能会给您一些想法

获取格式化字符串输出的最方便的方法之一是使用(
-f
)。您可以指定一个格式字符串,其中的占位符放在花括号中,并用数组的值填充该字符串:

PS C:\> '_{0}:{1}:{2}_' -f 'foo', 'bar', 'baz' _foo:bar:baz_
您可以使用以下代码快速获得固定大小的左对齐内容字符串:

写入主机“$myvariable$(“”*60)”。子字符串(0,60)


这将为您提供60个字符的固定宽度,内容向左对齐

您可以使用下一个代码执行固定大小:

$data = "Some text"
$size = 20
$str = [string]::new(' ',$size).ToCharArray()
$data.CopyTo(0,$str,0,$data.Length)
$str = $str -join ''

请出示你的密码。一个实际和期望结果的例子可能也会有帮助。简单,但优雅。 PS C:\> $s = 'barbarbar' PS C:\> $len = [math]::Min(7, $s.Length) PS C:\> '_{0,-5}:{1,7}:{2,-9}_' -f 'foo', $s.Substring(0, $len), 'baz' _foo :barbarb:baz _
$data = "Some text"
$size = 20
$str = [string]::new(' ',$size).ToCharArray()
$data.CopyTo(0,$str,0,$data.Length)
$str = $str -join ''