如何使用PowerShell更新文本文件中所有行的列值?

0tdrvxhp  于 2023-06-29  发布在  Shell
关注(0)|答案(3)|浏览(135)

我有一个文本文件,有1000行。每一行都有用波浪号(~)分隔符分隔的元素。现在,我只想将第一列值数字更改为随机/唯一数字,即34324242342333。它的长度为15个字符。但这行不通。

34324242342333~22~BB74~001~ 
34656453535353~22~C23~001~ 
00900900900889~22~N99~001~ 
97002021207021~22~F22~001~ 
23423432423421~22~V99~001~

Powershell代码:

$FileContent = Get-Content -Path C:\TestFiles\DummyData1.txt
        foreach ($Row in $FileContent) {
         $RandomNumber= Get-Random -Minimum 111111111111111 -Maximum 999999999999999
         $fields =  $Row.Split("~")
         $fields[0] =  $RandomNumber
         $fields -join '~' 
        }  Set-Content | C:\TestFiles\DummyDataUpdated.txt
ztyzrc3y

ztyzrc3y1#

不幸的是,PowerShell不允许直接通过管道传输foreach语句的输出。要使现有代码使用最少的更改,请将foreach语句 Package 在脚本块中:

$FileContent = Get-Content -Path C:\TestFiles\DummyData1.txt

# Wrap foreach in a scriptblock to be able to pipe it to Set-Content
& {
    foreach ($Row in $FileContent) {
         $RandomNumber= Get-Random -Minimum 111111111111111 -Maximum 999999999999999
         $fields =  $Row.Split("~")
         $fields[0] =  $RandomNumber
         $fields -join '~' 
    }  
} | Set-Content C:\TestFiles\DummyDataUpdated.txt

这里& {…}定义了一个脚本块,并使用调用操作符&立即执行它。
我还修复了Set-Content调用中的错别字(文件路径参数之前不应该有管道符号)。
作为一种替代的简化解决方案,去掉临时变量$fileContent,使用单个管道来避免foreach语句:

Get-Content -Path C:\TestFiles\DummyData1.txt | ForEach-Object {
    $RandomNumber= Get-Random -Minimum 111111111111111 -Maximum 999999999999999
    $fields =  $_.Split("~")
    $fields[0] =  $RandomNumber
    $fields -join '~' 
} | Set-Content C:\TestFiles\DummyDataUpdated.txt

变量$row已被自动变量$_替换,该变量表示由流水线处理的当前元素。

smdncfj3

smdncfj32#

你可以试试这样的方法:

$csv = Import-Csv C:\sourceFile.txt -Delimiter '~' -Header @("colA","colB","colC","colD")
$csv | select @{N="colA";E={(Get-Random -Minimum 111111111111111 -Maximum 999999999999999)}},colB,colC,colD

根据需要更改列名。

3pvhb19x

3pvhb19x3#

在任何数字上使用脚本块的替换,该数字除了数字之外没有任何东西:

Get-Content .\Data1.txt -Replace '(?<!\D.*)\d', { Random 9 } |Set-Content .\Updated.txt

相关问题