Home > other >  Insert comma before a value if it is blank
Insert comma before a value if it is blank

Time:10-06

Below is the data I have

-Ignored:31,Modified,src,data,all,*file,MINOSFIC/UTMNUP10
-Ignored:33,Modified,src,&,tgt,data,all,*file,MINOSFIC/UVEGAP10
-Ignored:92,Synchro,is,running,*file,MINOSFIC/VM010P50
-Ignored:01,Object,hold,(synchro),*file,MINOSFIC/VM010U51

here I am parsing the data and keeping in csv for 1st and 2nd line it is working but when it is coming to 3rd and 4th line, it is pushing the column value one forward as there is no data before *file

Please let me know how to handle this. how to insert a comma before *file if there is not entry (like for first 2 line it is all)

$allIGfiles = Get-ChildItem -Path 'C:\LG2' -Recurse -Filter "*LG_VFN*"

foreach($file in $allIGfiles)
{
    $filename = $file.FullName

$data = Get-Content $filename | Select -SkipLast 1
$Lines = @()
foreach ($line in $data){ 
if($line -match "Ignored")
{
    $Lines =$line
}
}

$NewLines = @($Lines | % { ($_  -replace "\s{2,}",",") -replace "(\d) ", '$1,'} )
$NewLines | Export-Csv 'c:\file.csv' -append -NoTypeInformation

Original data

-Ignored:31 Modified src data        all *file   MINOSFIC/UTMNUP10
-Ignored:33 Modified src & tgt data  all *file   MINOSFIC/UVEGAP10
-Ignored:92 Synchro is running           *file   MINOSFIC/VM010P50
-Ignored:01 Object hold (synchro)        *file   MINOSFIC/VM010U51

Update:

I am now getting the data like below but when i am trying to put it in csv it is only writing numbers to the file

-Ignored:31,Modified src data,all *file,MINOSFIC/UTMNUP10
-Ignored:33,Modified src & tgt data,all *file,MINOSFIC/UVEGAP10
-Ignored:92,Synchro is running,*file,MINOSFIC/VM010P50
-Ignored:01,Object hold (synchro),*file,MINOSFIC/VM010U51
-Ignored:01,Object hold (synchro),*file,MINOSFIC/VM010U52
-Ignored:01,Object hold (synchro),*file,MINOSFIC/VM010U53
-Ignored:01,Object hold (synchro),*file,MINOSFIC/VM010U54

CodePudding user response:

One approach is to first replace two consecutive spaces with a comma. Then replace digit followed with a space with the same digit via capture group and a comma. Like so,

$data=@(
 '-Ignored:31 Modified src data        all *file   MINOSFIC/UTMNUP10',
 '-Ignored:33 Modified src & tgt data  all *file   MINOSFIC/UVEGAP10',
 '-Ignored:92 Synchro is running           *file   MINOSFIC/VM010P50',
 '-Ignored:01 Object hold (synchro)        *file   MINOSFIC/VM010U51')

$data | % { ($_  -replace "\s{2,}",",") -replace "(\d) ", '$1,'}
-Ignored:31,Modified src data,all *file,MINOSFIC/UTMNUP10
-Ignored:33,Modified src & tgt data,all *file,MINOSFIC/UVEGAP10
-Ignored:92,Synchro is running,*file,MINOSFIC/VM010P50
-Ignored:01,Object hold (synchro),*file,MINOSFIC/VM010U51

This would get all *file in same column as *file. Should that not be enough, use ConvertFrom-String or do another replacement to introduce the missing column. As of how, you probably need to calculate how many commas there are and deduct from that if the column is needed.

CodePudding user response:

You could do this by using a regex that at first ignores the all value, but when constructing the comma separated new string, this will be inserted when found:

Read the file as string array

$data = Get-Content -Path $filename

I'm faking that by using a Here-String below:

$data = @"
-Ignored:31 Modified src data        all *file   MINOSFIC/UTMNUP10
-Ignored:33 Modified src & tgt data  all *file   MINOSFIC/UVEGAP10
-Ignored:92 Synchro is running           *file   MINOSFIC/VM010P50
-Ignored:01 Object hold (synchro)        *file   MINOSFIC/VM010U51
"@ -split '\r?\n'

$result = foreach ($line in $data) {
    if ($line -match '^(-Ignored:\d )\s (. )\s (\*file)\s (.*)') {
        '{0},{1},{2},{3},{4}' -f $matches[1], 
                                 ($matches[2] -replace 'all$').Trim(),
                                 ($matches[2] -split '\s{2,}')[-1],
                                 $matches[3], 
                                 $matches[4]

    }
}

# output to console screen
$result

# write to file
$result | Set-Content -Path 'X:\TheNewFile.txt'

Output:

-Ignored:31,Modified src data,all,*file,MINOSFIC/UTMNUP10
-Ignored:33,Modified src & tgt data,all,*file,MINOSFIC/UVEGAP10
-Ignored:92,Synchro is running,,*file,MINOSFIC/VM010P50
-Ignored:01,Object hold (synchro),,*file,MINOSFIC/VM010U51
  • Related