2016-10-14 2 views
1

У меня есть образец CSV:Mask все поля CSV

Name,Birthday 
Aman Sharma,12/2/92 

, и я хочу, чтобы маскировать все символы в PowerShell т.е.

Name,Birthday 
xxxx xxxxxx,xx/x/xx. 

Я попытался

(Get-Content .\aliases.csv)|% { $_ -replace '' ,'0'}|Set-Content test.csv 

, но то, что он делает, добавляет 0 после каждого символа, такого как

N0a0m0e0,B0i0r0t0h0d0a0y0 
A0m0a0n0 S0h0a0r0m0a0,1020/020/09020 

Что мне делать?

ответ

2

Вот быстрое и грязное решение, в котором я использую вспомогательную переменную для хранения первой строки. Однако есть более грациозное решение.

$content = Get-Content test.csv 
$firstLine = $content[0] 
$content = $content -replace '\w', 'x' 
$content[0] = $firstLine 
$content | Set-Content test.csv 
+1

Ваш класс персонажа лучше – Matt

+0

Помните, что '\ w' является [надстройкой] (https://msdn.microsoft.com/en-us/library/20bw873z%28v=vs.110%29. aspx # WordCharacter) '[a-zA-Z0-9]', тем не менее, так что он может соответствовать больше, чем предполагалось. –

2

-replace является оператором, поддерживающим регулярное выражение. '' или пробел в регулярном выражении соответствует пробелу между символами. Вот почему вы получаете результаты, которые вы делаете.

Не знаете, в чем смысл маскировки CSV, но чтобы получить что-то более близкое к тому, что вы хотите, учитывая ваши данные образца.

$oldFile = "c:\temp\test.csv" 
$newFile = "c:\temp\maskedTest.csv" 

# Read in the file contents 
$data = Get-Content $oldFile 
# Send the header to file unmasked 
$data | select -First 1 | Set-Content $newFile 
# Read in all lines after that and replaced the alphnumeric characters. 
$data | Select-Object -Skip 1 | ForEach-Object{$_ -replace "[a-z0-9]","X"} | Add-Content $newFile 

Так вместо того, чтобы заменить все символы продуманным Z, а также число 0, хотя 9.

+0

Привет, Мэтт. Я хочу замаскировать данные, так как есть некоторые учетные записи. которого мне нужно скрыть, но сохранить формат в целости. – Kaushal

+0

Спасибо, Мэтт. Он отлично работал. :) – Kaushal

0

попробовать этот

$res=Get-Content C:\temp\test2.csv 

    [email protected]() 
    for ($i = 0; $i -lt $res.Count; $i++) 
    { 
     if ($i -eq 0) 
     { 
     $newres+=$res[$i] 
     } 
     else 
     { 
     $newres+=$res[$i] -replace '\w', 'x' 
     } 
    } 

    Set-Content C:\temp\test2.csv -Value $newres 
1

Этот подход, вероятно, более элегантно, чем те, с помощью Get-Content, но не будет обеспечивать хорошую производительность. Однако различие не должно быть заметным для небольших файлов.

$csv = 'C:\path\to\your.csv' 
(Import-Csv $csv) | ForEach-Object { 
    foreach ($property in $_.PSObject.Properties) { 
    $property.Value = $property.Value -replace '\w', 'x' 
    } 
    $_ 
} | Export-Csv $csv -NoType 
+0

Я считал что-то вроде этого. Я считаю, что было бы более полезно, если бы были столбцы, которые вы хотели сохранить в своей первоначальной форме. – Matt