Powershell 固定宽度导出

use*_*207 3 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
Run Code Online (Sandbox Code Playgroud)

基本上,对于导出中的这个示例,我在第一行缺少 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

}
Run Code Online (Sandbox Code Playgroud)

提前致谢

Ans*_*ers 5

我仍然不太清楚你真正想要达到的输出是什么,但这也许会给你一些想法。

获取格式化字符串输出的最便捷方法之一是使用格式运算符( -f)。您指定一个带有大括号中的占位符的格式字符串,并用数组的值填充它:

PS C:\> '_{0}:{1}:{2}_' -f 'foo', 'bar', 'baz'
_foo:酒吧:baz_

列宽可以在格式字符串中指定,如下所示:

PS C:\> '_{0,-5}:{1,7}:{2,-9}_' -f 'foo', 'bar', 'baz'
_foo:酒吧:baz_

如您所见,负值将列向左对齐,正值将其向右对齐。

如果某个值对于给定的列宽来说可能太长,则需要截断它,例如使用以下Substring()方法:

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 _