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. I need this urgently. Thanks!
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
>Solution :
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.