2015-01-15 5 views
1

У меня есть текстовый файл, который использует фиксированную ширину для разделения столбцов.Экспорт фиксированной ширины Powershell

Я загружаю файл и создаю новый столбец, который объединяет значения первых двух столбцов. У меня есть проблема, что при экспорте данных мне нужно определить ширину фиксированного столбца 13 для столбца C.

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 

} 

Заранее спасибо

+1

Пожалуйста, покажите свой код. Может быть полезным и пример фактического и желаемого результата. –

ответ

0

Одним из решений является для каждой из строк использовать этот механизм при конкатенации:

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

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

if (($str.Length) -ge 13) { 
    Write-Host "$($str)" 
} else { 
    $padStr = " " * (13 - ($str.Length)) 
    Write-Host "$($str)$($padStr)" 
} 

Таким образом, вместо записи-Host CMDlet вы можете использовать соответствующий 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] 

} 
3

Вы можете создать пользовательский формат таблицы, используя наконечник объяснил here. Вот пример для 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.

1

Мне все еще не совсем ясно, какой результат вы на самом деле хотите достичь, но, возможно, это даст вам некоторую идею.

Одним из наиболее удобных способов получения форматированного строкового вывода является использование format operator (-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  _
0

Вы можете быстро иметь фиксированный размер выравнивается по левому краю строки контента, используя следующий код:

Write-Host "$ MYVARIABLE $ (" "* 60)".Подстроку (0,60)

это даст вам фиксированную ширину 60 символов с содержимым с выравниванием по левому