【问题标题】:Powershell: How to cleanly "deidentify" values in specific columnPowershell:如何干净地“去识别”特定列中的值
【发布时间】:2021-03-12 15:20:38
【问题描述】:

我正在寻找一种简洁的方法来对 csv 文件列中的值进行去标识化。我的工作方式有点像计数值等的技巧,我想看看是否有更现实的方法来解决这个问题。输入类似于:

One~Two~Three~Four
Test One~Failed for account 999999999, UserId: 7777777, Error: Duplicate nickname~8abc-964863c382d8~3/11/2021 1:03:43 PM
Test One~Failed for account 121212121, UserId: 3434343, Error: Duplicate firstname~zzzz-964863c382d8~3/11/2021 1:04:43 PM
Test One~Failed for account 565656565, UserId: 7878787, Error: Duplicate firstname~yyyy-964863c382d8~3/11/2021 1:05:43 PM

并且需要输出是这样的,把userId和账号换成x的:

One~Two~Three~Four
Test One~Failed for account XXXXXXXXX, UserId: XXXXXXX, Error: Duplicate nickname~8abc-964863c382d8~3/11/2021 1:03:43 PM
Test One~Failed for account XXXXXXXXX, UserId: XXXXXXX, Error: Duplicate firstname~zzzz-964863c382d8~3/11/2021 1:04:43 PM
Test One~Failed for account XXXXXXXXX, UserId: XXXXXXX, Error: Duplicate firstname~yyyy-964863c382d8~3/11/2021 1:05:43 PM

会有其他数据行,它们可能没有这些类型的行,但我只想在两列中识别这两种类型的值。任何想法将不胜感激!

【问题讨论】:

  • 如果它们的位数总是相同,前面有相同的单词,我认为使用正则表达式替换会为您工作。
  • 他们会一直处于相同的环境中吗? IE。帐户 ID 前面是文本“帐户”,后面是逗号?
  • 是的,它们将与上面完全相同 - 即。 account id 前面是文本“account”,后面是逗号,然后是 UserId: 和 number

标签: powershell csv


【解决方案1】:

一开始看错了问题..

您可以导入 csv 并仅更改字段 Two 中的身份,如下所示:

$data = Import-Csv -Path 'D:\Test\TheFile.csv' -Delimiter '~'
foreach ($item in $data) {
    $item.Two =  $item.Two -replace '(account\s*)[^,]+', '$1XXXXXXXXX' -replace '(UserId:\s*)\d+', '$1XXXXXXX'
}
$data | Export-Csv -Path 'D:\Test\TheUpdatedFile.csv' -Delimiter '~' -NoTypeInformation

Export-Csv 以上将引用 CSV 中的每个字段 如果您有 PowerShell 7,则可以将 -UseQuotes AsNeeded 添加到 Export-Csv cmdlet 以使字段不被引用。 对于低于此的PowerShell版本,您可以使用我之前发布的函数ConvertTo-CsvNoQuotes

输出(带引号)

"One"~"Two"~"Three"~"Four"
"Test One"~"Failed for account XXXXXXXXX, UserId: XXXXXXX, Error: Duplicate nickname"~"8abc-964863c382d8"~"3/11/2021 1:03:43 PM"
"Test One"~"Failed for account XXXXXXXXX, UserId: XXXXXXX, Error: Duplicate firstname"~"zzzz-964863c382d8"~"3/11/2021 1:04:43 PM"
"Test One"~"Failed for account XXXXXXXXX, UserId: XXXXXXX, Error: Duplicate firstname"~"yyyy-964863c382d8"~"3/11/2021 1:05:43 PM"

【讨论】:

  • 这非常好,正是我想要的。这个周末学习正则表达式。你们让这看起来太容易了!再次感谢,标记为已解决!
猜你喜欢
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多