我希望能够从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看起来很有帮助,但我并不确切知道如何根据我的问题调整它。
答案 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) { $_ }
我将其留作练习,以便将您选择的任何提示例程与其余代码集成。