shannonjk
shannonjk

Reputation: 45

Need to output multiple rows to CSV file

I am using the following script that iterates through hundreds of text files looking for specific instances of the regex expression within. I need to add a second data point to the array, which tells me the object the pattern matched in.

In the below script the [Regex]::Matches($str, $Pattern) | % { $_.Value } piece returns multiple rows per file, which cannot be easily output to a file.

What I would like to know is, how would I output a 2 column CSV file, one column with the file name (which should be $_.FullName), and one column with the regex results? The code of where I am at now is below.

$FolderPath = "C:\Test"

$Pattern = "(?i)(?<=\b^test\b)\s+(\w+)\S+"
$Lines = @()

Get-ChildItem -Recurse $FolderPath -File | ForEach-Object {
    $_.FullName
    $str = Get-Content $_.FullName
    $Lines += [Regex]::Matches($str, $Pattern) |
              % { $_.Value } |
              Sort-Object |
              Get-Unique
}

$Lines = $Lines.Trim().ToUpper() -replace '[\r\n]+', ' ' -replace ";", '' |
         Sort-Object |
         Get-Unique # Cleaning up data in array

Upvotes: 0

Views: 1199

Answers (1)

Parrish
Parrish

Reputation: 177

I can think of two ways but the simplest way is to use a hashtable (dict). Another way is create psobjects to fill your Lines variable. I am going to go with the simple way so you can only use one variable, the hashtable.

$FolderPath = "C:\Test"  

$Pattern = "(?i)(?<=\b^test\b)\s+(\w+)\S+"                     
$Results =@{}                                                                                 

    Get-ChildItem -Recurse $FolderPath -File |                                              
    ForEach-Object {                                                                                         
        $str = Get-Content $_.FullName                                                          
        $Line =  [regex]::matches($str,$Pattern) | % { $_.Value } | Sort-Object | Get-Unique
        $Line = $Line.Trim().ToUpper() -Replace '[\r\n]+', ' ' -Replace ";",'' | Sort-Object | Get-Unique # Cleaning up data in array
        $Results[$_.FullName] = $Line
    }
    $Results.GetEnumerator() | Select @{L="Folder";E={$_.Key}}, @{L="Matches";E={$_.Value}} | Export-Csv -NoType -Path <Path to save CSV>

Your results will be in $Results. $Result.keys contain the folder names. $Results.Values has the results from expression. You can reference the results of a particular folder by its key $Results["Folder path"]. of course it will error if the key does not exist.

Upvotes: 1

Related Questions