Reading list style text file into powershell array - list
I am provided a list of string blocks in a text file, and i need this to be in an array in powershell.
The list looks like this
a:1
b:2
c:3
d:
e:5
[blank line]
a:10
b:20
c:30
d:
e:50
[blank line]
...
and i want this in a powershell array to further work with it.
Im using
$output = #()
Get-Content ".\Input.txt" | ForEach-Object {
$splitline = ($_).Split(":")
if($splitline.Count -eq 2) {
if($splitline[0] -eq "a") {
#Write-Output "New Block starting"
$output += ($string)
$string = "$($splitline[1])"
} else {
$string += ",$($splitline[1])"
}
}
}
Write-Host $output -ForegroundColor Green
$output | Export-Csv ".\Output.csv" -NoTypeInformation
$output | Out-File ".\Output.txt"
But this whole thing feels quite cumbersome and the output is not a csv file, which at this point is i think because of the way i use the array. Out-File does produce a file that contains rows that are separated by commas.
Maybe someone can give me a push in the right direction.
Thx
x
One solution is to convert your data to an array of hash tables that can be read into a custom object. Then the output array object can be exported, formatted, or read as required.
$hashtables = (Get-Content Input.txt) -replace '(.*?):','$1=' | ConvertFrom-StringData
$ObjectShell = "" | Select-Object ($hashtable.keys | Select-Object -Unique)
$output = foreach ($hashtable in $hashtable) {
$obj = $ObjectShell.psobject.Copy()
foreach ($n in $hashtable.GetEnumerator()) {
$obj.($n.key) = $n.value
}
$obj
}
$output
$output | Export-Csv Output.csv -NoTypeInformation
Explanation:
The first colons (:) on each line are replaced with =. That enables ConvertFrom-StringData to create an array of hash tables with values on the LHS of the = being the keys and values on the RHS of the = being the values. If you know there is only one : on each line, you can make the -replace operation simpler.
$ObjectShell is just an object with all of the properties your data presents. You need all of your properties present for each line of data whether or not you assign values to them. Otherwise, your CSV output or table view within the console will have issues.
The first foreach iterates through the $hashtables array. Then we need to enumerate through each hash table to find the keys and values, which is performed by the second foreach loop. Each key/value pair is stored as a copy of $ObjectShell. The .psobject.Copy() method is used to prevent references to the original object. Updating data that is a reference will update the data of the original object.
$output contains the array of objects of all processed data.
Usability of output:
# Console Output
$output | format-table
a b c d e
- - - - -
1
2
3
5
10
20
30
50
# Convert to CSV
$output | ConvertTo-Csv -NoTypeInformation
"a","b","c","d","e"
"1",,,,
,"2",,,
,,"3",,
,,,"",
,,,,"5"
,,,,
"10",,,,
,"20",,,
,,"30",,
,,,"",
,,,,"50"
# Accessing Properties
$output.b
2
20
$output[0],$output[1]
a : 1
b :
c :
d :
e :
a :
b : 2
c :
d :
e :
Alternative Conversion:
$output = ((Get-Content Input.txt -raw) -split "(?m)^\r?\n") | Foreach-Object {
$data = $_ -replace "(.*?):(.*?)(\r?\n)",'"$1":"$2",$3'
$data = $data.Remove($data.LastIndexOf(','),1)
("{1}`r`n{0}`r`n{2}" -f $data,'{','}') | ConvertFrom-Json
}
$output | ConvertTo-Csv -NoType
Alternative Explanation:
Since ConvertFrom-StringData does not guarantee hash table key order, this alternative readies the file for a JSON conversion. This will maintain the property order listed in the file provided each group's order is the same. Otherwise, the property order of the first group will be respected.
All properties and their respective values are divided by the first : character on each line. The property and value are each surrounded by double quotes. Each property line is separated by a ,. Then finally the opening { and closing } are added. The resulting JSON-formatted string is converted to a custom object.
You can split by \n newline, see example:
$text = #"
a:1
b:2
c:3
d:
e:5
a:10
b:20
c:30
d:
e:50
e:50
e:50
e:50
"#
$Array = $text -split '\n' | ? {$_}
$Array.Count
15
if you want to exclude the empty lines, add ? {$_}
With your example:
$Array = (Get-Content ".\Input.txt") -split '\n' | ? {$_}
Related
I want to split a string from : to \n in Powershell script
I am using a config file that contains some information as shown below. User1:xyz#gmail.com User1_Role:Admin NAME:sdfdsfu4343-234324-ffsdf-34324d-dsfhdjhfd943 ID:xyz#abc-demo-test-abc-mssql Password:rewrfsdv34354*fds*vdfg435434 I want to split each value from*: to newline* in my Powershell script. I am using -split '[: \n]' it matches perfectly until there is no '' in the value. If there is an '*' it will fetch till that. For example, for Password, it matches only rewrfsdv34354. Here is my code: $i = 0 foreach ($keyOrValue in $Contents -split '[: *\n]') { if ($i++ % 2 -eq 0) { $varName = $keyOrValue } else { Set-Variable $varName $keyOrValue } } I need to match all the chars after : to \n. Please share your ideas.
It's probably best to perform two separate splits here, it makes things easier to work out if the code is going wrong for some reason, although the $i % 2 -eq 0 part is a neat way to pick up key/value. I would go for this: # Split the Contents variable by newline first foreach ($line in $Contents -split '[\n]') { # Now split each line by colon $keyOrValue = $line -split ':' # Then set the variables based on the parts of the colon-split Set-Variable $keyOrValue[0] $keyOrValue[1] }
You could also convert to a hashmap and go from there, e.g.: $h = #{} gc config.txt | % { $key, $value = $_ -split ' *: *'; $h[$key] = $value } Or with ConvertFrom-StringData: $h = (gc -raw dims.txt) -replace ':','=' | ConvertFrom-StringData Now you have convenient access to keys and values, e.g.: $h Output: Name Value ---- ----- Password rewrfsdv34354*fds*vdfg435434 User1 xyz#gmail.com ID xyz#abc-demo-test-abc-mssql NAME sdfdsfu4343-234324-ffsdf-34324d-dsfhdjhfd943 User1_Role Admin Or only keys: $h.keys Output: Password User1 ID NAME User1_Role Or only values: $h.values Output: rewrfsdv34354*fds*vdfg435434 xyz#gmail.com xyz#abc-demo-test-abc-mssql sdfdsfu4343-234324-ffsdf-34324d-dsfhdjhfd943 Admin Or specific values: $h['user1'] + ", " + $h['user1_role'] Output: xyz#gmail.com, Admin etc.
Powershell script using RegEx to look for a pattern in one .txt and find line in a second .txt
I have a real "headsmasher" on my plate. I have this piece of script: $lines = Select-String -List -Path $sourceFile -Pattern $pattern -Context 20 foreach ($id in $lines) { if (Select-String -Quiet -LiteralPath export.txt -Pattern "$($Matches[1]).+$($id.Pattern)") { } else { Select-String -Path $sourceFile -Pattern $pattern -Context 20 >> $duplicateTransactionsFile } } but it is not working for me as I wanted it to. I have two .txt files: "$sourcefile = source.txt" and "export.txt" The source.txt looks like something like this: Some text here *********** ------------------------------------------------ F I N A L C O U N T 1 9 , 9 9 ************** ** [0000123456] ID Number:0000123456 Complete! ****************! *********** Some other text here******* ------------------------------------------------ F I N A L C O U N T 9 , 9 9 ********** ** [0000789000] ID Number:0000789000 Complete! ******************! ************ The export.txt is like this: 0000123456 19,99 0000555555 ,89 0000666666 3,05 0000777777 31,19 0000789000 9,99 What I am trying to do is look into source.txt and search for the number that I enter (spaced out in my case) *e.g: "9,99" but only that. As you can see, the next number in the source.txt is "19,99" and it also contains "9,99" but I do not want it to be matched. and once I find the number, look for the next line in the source.txt that contains the text "ID Number:" then get the numbers right after the ":" Once I get those numbers after the ":", I want to now look into the export.txt and see if the numbers after the ":" are there and whether it has the "9,99" on the same line next to it but exactly "9,99" and nothing else lie "19,99", "29,99", and so on. Then the rest is easy: if (*true*) { do this } else { do that } Could you guys give me some love here and help a brother out? I very much appreciate any help or hint you could share. Best of wishes!
You could approach this like below: # read the export.txt file and convert to a Hashtable for fast lookup $export = ((Get-Content -Path 'D:\Test\export.txt').Trim() -replace '\s+', '=') -join "`r`n" | ConvertFrom-StringData # read the source file and split into multiline data blocks $source = ((Get-Content -Path 'D:\Test\source.txt' -Raw) -split '-{2,}').Trim() | Where-Object { $_ -match '(?sm)^\s?F I N A L C O U N T' } # make sure the number given is spaced-out $search = (((Read-Host "Search for Final Count number") -replace '\s' -split '') -join ' ').Trim() Write-Host "Looking for a matching item using Final Count '$search'" # see if we can find a data block that matches the $search $blocks = $source | Where-Object { $_ -match "(?sm)^F I N A L C O U N T\s+$search\s?$" } if (!$blocks) { Write-Host "No item in source.txt could be found with Final Count '$search'" -ForegroundColor Red } else { # loop over the data block(s) and pick the one that matches the search count $blocks | ForEach-Object { # parse out the ID $id = $_ -replace '(?sm).*ID Number:(\d+).*', '$1' # check if the $export Hashtable contains a key with that ID number if ($export.Contains($id)) { # check if that item has a value of $search without the spaces if ($export[$id] -eq ($search -replace '\s')) { # found it; do something Write-Host "Found a match in the export.txt" -ForegroundColor Green } else { # found ID with different FinalCount Write-Host "An item with ID '$id' was found, but with different Final Count ($($export[$id]))" -ForegroundColor Red } } else { # ID not found Write-Host "No item with ID '$id' could be found in the export.txt" -ForegroundColor Red } } } If as per your comment, you would like the code to loop over the Final Count numbers found in the source.txt file instead of a user typing in a number to search for, you can shorten the above code to: # read the export.txt file and convert to a Hashtable for fast lookup $export = ((Get-Content -Path 'D:\Test\export.txt').Trim() -replace '\s+', '=') -join "`r`n" | ConvertFrom-StringData # read the source file and split into multiline data blocks $blocks = ((Get-Content -Path 'D:\Test\source.txt' -Raw) -split '-{2,}').Trim() | Where-Object { $_ -match '(?sm)^\s?F I N A L C O U N T' } if (!$blocks) { Write-Host "No item in source.txt could be found with Final Count '$search'" -ForegroundColor Red } else { # loop over the data block(s) $blocks | ForEach-Object { # parse out the FINAL COUNT number to look for in the export.txt $search = ([regex]'(?sm)^F I N A L C O U N T\s+([\d,\s]+)$').Match($_).Groups[1].Value # remove the spaces, surrounding '0' and trailing comma (if any) $search = ($search -replace '\s').Trim('0').TrimEnd(',') Write-Host "Looking for a matching item using Final Count '$search'" # parse out the ID $id = $_ -replace '(?sm).*ID Number:(\d+).*', '$1' # check if the $export Hashtable contains a key with that ID number if ($export.Contains($id)) { # check if that item has a value of $search without the spaces if ($export[$id] -eq $search) { # found it; do something Write-Host "Found a match in the export.txt with ID: $($export[$id])" -ForegroundColor Green } else { # found ID with different FinalCount Write-Host "An item with ID '$id' was found, but with different Final Count ($($export[$id]))" -ForegroundColor Red } } else { # ID not found Write-Host "No item with ID '$id' could be found in the export.txt" -ForegroundColor Red } } }
There are surely multiple valid ways to accomplish this. Here is my approach: (See comments for explanations. Let me know if you have any questions) param ( # You can provide this when calling the script using "-Search 9,99" # If not privided, powershell will prompt to enter the value [Parameter(Mandatory)] $Search, $Source = "source.txt", $Export = "export.txt" ) # insert spaces $pattern = $Search.ToCharArray() -join " " # Search for the value in the source file. $found = $false switch -Regex -File $Source { # This regex looks for something that is not a number, # followed by only whitespace, and then your (spaced) search value. # This makes sure "19,99" is not matched with "9,99". # You could use a more elaborate regex here, but for your example, # this one should work fine. "\D\s+$pattern" { $found = $true } "ID Number:(\d+)" { # Get the ID number from the match. $id = $Matches[1] # If the search value was found # (that means, this ID number is immediately followed by the search value) # we can stop looking. if ($found) { break } } } # quick check if the value was actually found if (-not $found) { throw "Value $Search not found in $Source." } # Search for the id in the export file. switch -Regex -File $Export { "$id\s+(\S+)" { # Get the amount value from the match $value = $Matches[1] # If the value matches your search... if ($value -eq $search) { # do this } else { # otherwise do that } break } } Note: You could additionally convert the values to decimal to account for different text representations when searching and comparing.
PowerShell Regex with csv file
I'm currently trying to match a pattern of IDs and replace with 0 or 1. example pc0045601234 replace with 1234 the last 4 and add the 3rd digit in front "01234" I tried the code below but the out only filled the userid column with No matching employee $reportPath = '.\report.csv'`$reportPath = '.\report.csv'` $csvPath = '.\output.csv' $data = Import-Csv -Path $reportPath $output = #() foreach ($row in $data) { $table = "" | Select ID,FirstName,LastName,userid $table.ID = $row.ID $table.FirstName = $row.FirstName $table.LastName = $row.LastName switch -Wildcard ($row.ID) { {$row.ID -match 'P\d\d\d\d\d\D\D\D'} {$table.userid = "Contractor"; continue} {$row.ID -match 'SEC\d\d\d\D\D\D\D'} {$table.userid = "Contractor"; continue} {$row.ID.StartsWith("P005700477")} {$table.userid = $row.ID -replace "P005700477","0477"; continue} {$row.ID.StartsWith("P00570")} {$table.userid = $row.ID -replace "P00570","0"; continue} default {$table.userid = "No Matching Employee"} } $output += $table } $output | Export-csv -NoTypeInformation -Path $csvPath
Here are three different ways to achieve the desired result. The first two use the same technique, just written in a different way. First we put the sample data in a variable as a multiline string array. This is the equivalent as $text = Get-Content $somefile $text = #' PC05601234 PC15601234 '# -split [environment]::NewLine Option 1 # convert to character array, select the 3rd and last 4 digits. $text | foreach {-join ($_.ToChararray()| select -Skip 2 -First 1 -Last 4)} Option 2 # same as above, requiring an extra -join to avoid spaces. $text | foreach {(-join $_.ToChararray()| foreach{$_[2]+(-join $_[-4..-1])})} Option 3 # my preference, regex. Capture the desired digits and replace the entire string with those two captured values. $text -replace '^\D+(?!=\d)(\d)\w+([\d]{4}$)','$1$2' All of these output 01234 11234 Further testing with different char/digit combinations and lengths. $text = #' PC05601234 PC15601234 PC0ABC124321 PC1DE4321 PC0A5678 PC1ABCD215678 '# -split [environment]::NewLine Running the new sample data through each option all produce this output 01234 11234 04321 14321 05678 15678
Loop through a text file and Extract a set of 100 IP's from a text file and output to separate text files
I have a text file that contains around 900 IP's. I need to create batch of 100 IP's from that file and output them into new files. That would create around 9 text files. Our API only allows to POST 100 IP's at a time. Could you please help me out here? Below is the format of the text file 10.86.50.55,10.190.206.20,10.190.49.31,10.190.50.117,10.86.50.57,10.190.49.216,10.190.50.120,10.190.200.27,10.86.50.58,10.86.50.94,10.190.38.181,10.190.50.119,10.86.50.53,10.190.50.167,10.190.49.30,10.190.49.89,10.190.50.115,10.86.50.54,10.86.50.56,10.86.50.59,10.190.50.210,10.190.49.20,10.190.50.172,10.190.49.21,10.86.49.18,10.190.50.173,10.86.49.49,10.190.50.171,10.190.50.174,10.86.49.63,10.190.50.175,10.13.12.200,10.190.49.27,10.190.49.19,10.86.49.29,10.13.12.201,10.86.49.28,10.190.49.62,10.86.50.147,10.86.49.24,10.86.50.146,10.190.50.182,10.190.50.25,10.190.38.252,10.190.50.57,10.190.50.54,10.86.50.78,10.190.50.23,10.190.49.8,10.86.50.80,10.190.50.53,10.190.49.229,10.190.50.58,10.190.50.130,10.190.50.22,10.86.52.22,10.19.68.61,10.41.43.130,10.190.50.56,10.190.50.123,10.190.49.55,10.190.49.66,10.190.49.68,10.190.50.86,10.86.49.113,10.86.49.114,10.86.49.101,10.190.50.150,10.190.49.184,10.190.50.152,10.190.50.151,10.86.49.43,10.190.192.25,10.190.192.23,10.190.49.115,10.86.49.44,10.190.38.149,10.190.38.151,10.190.38.150,10.190.38.152,10.190.38.145,10.190.38.141,10.190.38.148,10.190.38.142,10.190.38.144,10.190.38.147,10.190.38.143,10.190.38.146,10.190.192.26,10.190.38.251,10.190.49.105,10.190.49.110,10.190.49.137,10.190.49.242,10.190.50.221,10.86.50.72,10.86.49.16,10.86.49.15,10.190.49.112,10.86.49.32,10.86.49.11,10.190.49.150,10.190.49.159,10.190.49.206,10.86.52.28,10.190.49.151,10.190.49.207,10.86.49.19,10.190.38.103,10.190.38.101,10.190.38.116,10.190.38.120,10.190.38.102,10.190.38.123,10.190.38.140,10.190.198.50,10.190.38.109,10.190.38.108,10.190.38.111,10.190.38.112,10.190.38.113,10.190.38.114,10.190.49.152,10.190.50.43,10.86.49.23,10.86.49.205,10.86.49.220,10.190.50.230,10.190.192.238,10.190.192.237,10.190.192.239,10.190.50.7,10.190.50.10,10.86.50.86,10.190.38.125,10.190.38.127,10.190.38.126,10.190.50.227,10.190.50.149,10.86.49.59,10.190.49.158,10.190.49.157,10.190.44.11,10.190.38.124,10.190.50.153,10.190.49.40,10.190.192.235,10.190.192.236,10.190.50.241,10.190.50.240,10.86.46.8,10.190.38.234,10.190.38.233,10.86.50.163,10.86.50.180,10.86.50.164,10.190.49.245,10.190.49.244,10.190.192.244,10.190.38.130,10.86.49.142,10.86.49.102,10.86.49.141,10.86.49.67,10.190.50.206,10.190.192.243,10.190.192.241 I tried looking online to come up with a bit of working code but can't really think what would best work in this situation $IP = 'H:\IP.txt' $re = '\d*.\d*.\d*.\d*,' Select-String -Path $IP -Pattern $re -AllMatches | Select-Object -Expand Matches | ForEach-Object { $Out = 'C:\path\to\out.txt' -f | Set-Content $clientlog }
This will do what you are after $bulkIP = (get-content H:\IP.txt) -split ',' $i = 0 # Created loop Do{ # Completed an action every 100 counts (including 0) If(0 -eq $i % 100) { # If the array is a valid entry. Removing this will usually end up creating an empty junk file called -1 or something If($bulkIP[$i]) { # outputs 100 lines into a folder with the starting index as the name. # Eg. The first 1-100, the file would be called 1.txt. 501-600 would be called 501.txt etc $bulkIP[$($i)..$($i+99)] | Out-File "C:\path\to\$($bulkip.IndexOf($bulkip[$($i)+1])).txt" } } $i++ }While($i -le 1000)
what this does ... calculates the number of batches calcs the start & end index of each batch creates a range from the above creates a PSCustomObject to hold each batch creates an array slice from the range sends that out to the collection $Var shows what is in the collection & in the 1st batch from that collection here's the code ... # fake reading in a raw text file # in real life, use Get-Content -Raw $InStuff = #' 10.86.50.55,10.190.206.20,10.190.49.31,10.190.50.117,10.86.50.57,10.190.49.216,10.190.50.120,10.190.200.27,10.86.50.58,10.86.50.94,10.190.38.181,10.190.50.119,10.86.50.53,10.190.50.167,10.190.49.30,10.190.49.89,10.190.50.115,10.86.50.54,10.86.50.56,10.86.50.59,10.190.50.210,10.190.49.20,10.190.50.172,10.190.49.21,10.86.49.18,10.190.50.173,10.86.49.49,10.190.50.171,10.190.50.174,10.86.49.63,10.190.50.175,10.13.12.200,10.190.49.27,10.190.49.19,10.86.49.29,10.13.12.201,10.86.49.28,10.190.49.62,10.86.50.147,10.86.49.24,10.86.50.146,10.190.50.182,10.190.50.25,10.190.38.252,10.190.50.57,10.190.50.54,10.86.50.78,10.190.50.23,10.190.49.8,10.86.50.80,10.190.50.53,10.190.49.229,10.190.50.58,10.190.50.130,10.190.50.22,10.86.52.22,10.19.68.61,10.41.43.130,10.190.50.56,10.190.50.123,10.190.49.55,10.190.49.66,10.190.49.68,10.190.50.86,10.86.49.113,10.86.49.114,10.86.49.101,10.190.50.150,10.190.49.184,10.190.50.152,10.190.50.151,10.86.49.43,10.190.192.25,10.190.192.23,10.190.49.115,10.86.49.44,10.190.38.149,10.190.38.151,10.190.38.150,10.190.38.152,10.190.38.145,10.190.38.141,10.190.38.148,10.190.38.142,10.190.38.144,10.190.38.147,10.190.38.143,10.190.38.146,10.190.192.26,10.190.38.251,10.190.49.105,10.190.49.110,10.190.49.137,10.190.49.242,10.190.50.221,10.86.50.72,10.86.49.16,10.86.49.15,10.190.49.112,10.86.49.32,10.86.49.11,10.190.49.150,10.190.49.159,10.190.49.206,10.86.52.28,10.190.49.151,10.190.49.207,10.86.49.19,10.190.38.103,10.190.38.101,10.190.38.116,10.190.38.120,10.190.38.102,10.190.38.123,10.190.38.140,10.190.198.50,10.190.38.109,10.190.38.108,10.190.38.111,10.190.38.112,10.190.38.113,10.190.38.114,10.190.49.152,10.190.50.43,10.86.49.23,10.86.49.205,10.86.49.220,10.190.50.230,10.190.192.238,10.190.192.237,10.190.192.239,10.190.50.7,10.190.50.10,10.86.50.86,10.190.38.125,10.190.38.127,10.190.38.126,10.190.50.227,10.190.50.149,10.86.49.59,10.190.49.158,10.190.49.157,10.190.44.11,10.190.38.124,10.190.50.153,10.190.49.40,10.190.192.235,10.190.192.236,10.190.50.241,10.190.50.240,10.86.46.8,10.190.38.234,10.190.38.233,10.86.50.163,10.86.50.180,10.86.50.164,10.190.49.245,10.190.49.244,10.190.192.244,10.190.38.130,10.86.49.142,10.86.49.102,10.86.49.141,10.86.49.67,10.190.50.206,10.190.192.243,10.190.192.241 '# $SplitInStuff = $InStuff.Split(',') $BatchSize = 25 $BatchCount = [math]::Truncate($SplitInStuff.Count / $BatchSize) + 1 $Start = $End = 0 $Result = foreach ($BC_Item in 1..$BatchCount) { $Start = $End if ($BC_Item -eq 1) { $End = $Start + $BatchSize - 1 } else { $End = $Start + $BatchSize } $Range = $Start..$End [PSCustomObject]#{ IP_List = $SplitInStuff[$Range] } } $Result '=' * 20 $Result[0] '=' * 20 $Result[0].IP_List.Count '=' * 20 $Result[0].IP_List screen output ... IP_List ------- {10.86.50.55, 10.190.206.20, 10.190.49.31, 10.190.50.117...} {10.86.49.18, 10.190.50.173, 10.86.49.49, 10.190.50.171...} {10.86.50.80, 10.190.50.53, 10.190.49.229, 10.190.50.58...} {10.190.49.115, 10.86.49.44, 10.190.38.149, 10.190.38.151...} {10.86.49.32, 10.86.49.11, 10.190.49.150, 10.190.49.159...} {10.86.49.23, 10.86.49.205, 10.86.49.220, 10.190.50.230...} {10.190.50.240, 10.86.46.8, 10.190.38.234, 10.190.38.233...} ==================== {10.86.50.55, 10.190.206.20, 10.190.49.31, 10.190.50.117...} ==================== 25 ==================== 10.86.50.55 10.190.206.20 10.190.49.31 10.190.50.117 10.86.50.57 10.190.49.216 10.190.50.120 10.190.200.27 10.86.50.58 10.86.50.94 10.190.38.181 10.190.50.119 10.86.50.53 10.190.50.167 10.190.49.30 10.190.49.89 10.190.50.115 10.86.50.54 10.86.50.56 10.86.50.59 10.190.50.210 10.190.49.20 10.190.50.172 10.190.49.21 10.86.49.18
try this $cpt=0 $Rang=1 #remove old file Get-ChildItem "H:\FileIP_*.txt" -file | Remove-Item -Force (Get-Content "H:\IP.txt") -split ',' | %{ if (!($cpt++ % 100)) {$FileResult="H:\FileIP_{0:D3}.txt" -f $Rang++} # build filename if cpt divisile by 100 $_ | Out-File $FileResult -Append }
Data extraction using Regular expressions
Hi I have a file of the format [stuff not needed]Type:A1[stuff not needed] [stuff not needed]Name:B1[stuff not needed] Row:Sampletext Row:Sampletext [stuff not needed]Type:A2[stuff not needed] [stuff not needed]Name:B2[stuff not needed] Row:Sampletext2 Row:Sampletext2 Row:Sampletext2 I am using regexin powershell to extract the data. I am using something like Regex1|Regex2|Regex3 ,and saving the output to a file. The output comes in the format: A1 B1 Sampletext Sampletext A2 B2 Sampletext2 Sampletext2 Sampletext2 I want it in the format A1 B1 Sampletext A1 B1 Sampletext A2 B2 Sampletext2 A2 B2 Sampletext2 A2 B2 Sampletext2 I am new to PowerShell, is there any way I can do this ? This is the exact code the I have: $input_path = ‘idx.txt’ $output_file = ‘output.txt’ $regex = ‘Type:\s([A-Za-z]*)|Name:\s\s([A-Za-z]*)|[A-Za-z][a-z0-9A-Z_]*(?:\s*[0-6]\s*[0-4]\s\s[\s\d]\d\s*0)’ select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file The data is too big to be posted here ,but ill just create a sample data set.But the regular expressions are working ,maybe crude but its capturing the data required . for the sake of the example ,we can have Type:([A-Za-z])|Name:([A-Za-z])|Row:([A-Za-z]*) as the regular expressions
Check every line if it has type or name and set the corresponding variables only, but if it has row output the type and name variables along with the current row contents. $allmatches = Select-String '(Type|Name|Row):\s*(\w*)' $input_path -allmatches $output = foreach ($m in $allmatches) { $data = $m.Matches.Groups[2].Value switch ($m.Matches.Groups[1].Value) { 'Type' { $type = $data; break } 'Name' { $name = $data; break } 'Row' { "$type $name $data" } } } $output | Set-Content $output_path -Encoding UTF8 Notes: We use a faster foreach expression instead of slower pipelining via foreach with a scriptblock. \w in regex means any word character including a-zA-Z0-9 and _ and some more Regex-matching and string comparison are case-insensitive in PowerShell by default