Replace blank characters from a file line by line

天大地大妈咪最大 提交于 2019-12-11 09:46:14

问题


I would like to be able to find all blanks from a CSV file and if a blank character is found on a line then should appear on the screen and I should be asked if I want to keep the entire line which contains that white space or remove it.

Let's say the directory is C:\Cr\Powershell\test. In there there is one CSV file abc.csv.

Tried doing it like this but in PowerShell ISE the $_.PSObject.Properties isn't recognized.

$csv = Import-Csv C:\Cr\Powershell\test\*.csv | Foreach-Object {
   $_.PSObject.Properties | Foreach-Object {$_.Value = $_.Value.Trim()}  
}

I apologize for not includding more code and what I tried more so far but they were silly attempts since I just begun.

This looks helpful but I don't know exactly how to adapt it for my problem.


回答1:


Ok man here you go:

$yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Retain line."

$no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Delete line."

$n = @()

$f = Get-Content .\test.csv  
foreach($item in $f) {

if($item -like "* *"){ 
    $res = $host.ui.PromptForChoice("Title", "want to keep this line? `n $item", [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no), 0)

    switch ($res) 
    {
        0 {$n+=$item}
        1 {}
    }


} else {
    $n+=$item
}

}

$n | Set-Content .\test.csv

if you have questions please post in the comments and i will explain




回答2:


Get-Content is probably a better approach than Import-Csv, because that'll allow you to check an entire line for spaces instead of having to check each individual field. For fully automated processing you'd just use a Where-Object filter to remove non-matching lines from the output:

Get-Content 'C:\CrPowershell\test\input.csv' |
  Where-Object { $_ -notlike '* *' } |
  Set-Content 'C:\CrPowershell\test\output.csv'

However, since you want to prompt for each individual line that contains spaces you need a ForEach-Object (or a similiar construct) and a nested conditional, like this:

Get-Content 'C:\CrPowershell\test\input.csv' | ForEach-Object {
  if ($_ -notlike '* *') { $_ }
} | Set-Content 'C:\CrPowershell\test\output.csv'

The simplest way to prompt a user for input is Read-Host:

$answer = Read-Host -Prompt 'Message'
if ($answer -eq 'y') {
  # do one thing
} else {
  # do another
}

In your particular case you'd probably do something like this for any matching line:

$anwser = Read-Host "$_`nKeep the line? [y/n] "
if ($answer -ne 'n') { $_ }

The above checks if the answer is not n to make removal of the line a conscious decision.

Other ways to prompt for user input are choice.exe (which has the additional advantage of allowing a timeout and a default answer):

choice.exe /c YN /d N /t 10 /m "$_`nKeep the line"
if ($LastExitCode -ne 2) { $_ }

or the host UI:

$title   = $_
$message = 'Keep the line?'

$yes = New-Object Management.Automation.Host.ChoiceDescription '&Yes'
$no  = New-Object Management.Automation.Host.ChoiceDescription '&No'

$options = [Management.Automation.Host.ChoiceDescription[]]($yes, $no)

$answer = $Host.UI.PromptForChoice($title, $message, $options, 1)
if ($answer -ne 1) { $_ }

I'm leaving it as an exercise for you to integrate whichever prompting routine you chose with the rest of the code.



来源:https://stackoverflow.com/questions/34593427/replace-blank-characters-from-a-file-line-by-line

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!