逐行替换文件中的空白字符

时间:2016-01-04 14:31:15

标签: csv powershell powershell-v3.0 powershell-ise

我希望能够从CSV文件中找到所有空白,如果在一行上找到一个空白字符,那么应该出现在屏幕上,我会被问到是否要保留包含该白色的整行空格或删除它。

我们说目录是C:\Cr\Powershell\test。在那里有一个CSV文件abc.csv

尝试这样做,但在PowerShell ISE中,$_.PSObject.Properties无法识别。

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

我为没有包含更多代码和迄今为止我尝试过的内容而道歉,但自从我刚开始以来,这些尝试都是愚蠢的。

This看起来很有帮助,但我并不确切知道如何根据我的问题调整它。

2 个答案:

答案 0 :(得分:1)

好的男人,你走了:

$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

如果您有任何疑问,请在评论中发帖,我会解释

答案 1 :(得分:1)

Get-Content可能是比Import-Csv更好的方法,因为它允许您检查整行的空格而不必检查每个单独的字段。对于全自动处理,您只需使用Where-Object过滤器从输出中删除不匹配的行:

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

但是,由于您要提示每个包含空格的单独行,您需要ForEach-Object(或类似的构造)和嵌套条件,如下所示:

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

提示用户输入的最简单方法是Read-Host

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

在您的特定情况下,您可能会对任何匹配的行执行类似的操作:

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

以上检查答案是否 n,以便有意识地删除该行。

提示用户输入的其他方法是choice.exe(它还具有允许超时和默认答案的额外优势):

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

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) { $_ }

我将其留作练习,以便将您选择的任何提示例程与其余代码集成。