英文:
How to update column values in all lines in a text file using Powershell?
问题
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 -Path C:\TestFiles\DummyDataUpdated.txt
英文:
I have a text file that has 1000's of lines. And each lines has elements that are separated by tilde(~) delimiter. Now, i want to just change the first column value numbers to a Random/Unique number, i.e 34324242342333. It is of 15 chars length. But this is not working.
34324242342333~22~BB74~001~
34656453535353~22~C23~001~
00900900900889~22~N99~001~
97002021207021~22~F22~001~
23423432423421~22~V99~001~
Powershell code:
$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
答案1
得分: 0
你可以尝试像这样做:
$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
根据你的需求更改列名。
英文:
you can try something like this:
$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
Change the columns name to fit your need.
答案2
得分: 0
很不幸,PowerShell不允许直接将foreach
语句的输出传送。为了使您现有的代码更改最少地能正常工作,请将foreach
语句包装在脚本块中:
$FileContent = Get-Content -Path C:\TestFiles\DummyData1.txt
# 将foreach包装在脚本块中,以便将其传送到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
已被自动变量$_
替换,它表示管道当前处理的元素。
英文:
Unfortunately PowerShell doesn't permit piping the output of a foreach
statement directly. To make your existing code working with the least amount of changes, wrap the foreach
statement in a scriptblock:
$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
Here & {…}
defines a scriptblock and immediately executes it, using the call operator &
.
Also I've fixed the typo in the Set-Content
call (there should be no pipe symbol before the file path argument).
As an alternative, streamlined solution, get rid of the temporary variable $fileContent
and use a single pipeline to avoid the foreach
statement:
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
The variable $row
has been replaced by automatic variable $_
which denotes the current element processed by the pipeline.
答案3
得分: 0
使用具有脚本块的替换来替换任何不是由数字之外的内容前置的数字:
Get-Content .\Data1.txt -Replace ''(?<!\D.*)\d'', { Random 9 } | Set-Content .\Updated.txt
英文:
Using a replacement with a script block on any digit which is not proceeded by anything but a digit:
Get-Content .\Data1.txt -Replace '(?<!\D.*)\d', { Random 9 } |Set-Content .\Updated.txt
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论