簡體   English   中英

Powershell固定寬度導出

[英]Powershell fixed width export

我有一個文本文件,它使用固定的寬度分隔列。

我正在加載文件並創建一個新列,該列隱含了前兩列的值。 我的問題是,導出數據時,我需要為列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

}

提前致謝

您可以使用此處說明的技巧創建自定義表格格式。 這是Get-Process的示例:

$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構建一個表達式,該表達式將對每行進行管道Format-Table 您無需構建自己的每一行格式,而是構建一個哈希並將其通過Format-Table傳遞。

對我來說仍然不清楚您實際上想要實現什么輸出,但是也許這會給您一些想法。

獲得格式化字符串輸出的最便捷方法之一是使用格式運算符-f )。 您指定一個格式字符串,在大括號中使用占位符,並用數組的值填充它:

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

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

PS C:\> '_{0,-5}:{1,7}:{2,-9}_' -f 'foo', 'bar', 'baz'
_foo  :    bar: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      _

您可以使用以下代碼快速獲得固定大小的左對齊內容字符串:

寫主機“ $ myvariable $(”“ * 60)”。Substring(0,60)

這將為您提供60個字符的固定寬度,內容向左對齊

一種解決方案是,對於每個行,在連接時使用此機制:

$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]

} 

您可以使用以下代碼進行固定大小的操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM