2016-01-04 38 views
1

我希望能夠從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()} 
} 

我不includding更多的代碼和我嘗試了,但迄今爲止他們是愚蠢的嘗試,因爲我剛剛開始道歉。

This看起來很有幫助,但我不知道如何適應我的問題。

+0

你的問題到底是什麼?如何提示用戶輸入?如何替換空白字符?或者如何逐行處理文件?這是三個不同的問題,你不應該混淆它們。 –

+0

如何逐行替換空白字符並等待每行的用戶輸入。對不起,如果我混合起來,但即使我問3個不同的問題,不會解決我的問題。我需要所有3合一 – CM2K

+0

@ CM2K你想刪除整行還是隻替換空白字符 – Paul

回答

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 

,如果您有任何疑問,請發表在評論中,我將解釋

+0

哦,謝謝!我會馬上測試它。我期待着更多地瞭解PowerShell – CM2K

+0

的工作原理。謝謝!部分我不完全得到它如何顯示與空間的線。 '$ n = @()'被添加到if中的項目是肯定的。但是,如何將一條線設置爲一個項目。我正在查看'foreach($ item in $ f)',但我沒有完全理解它 – CM2K

+0

@ CM2K這一行使用'$ item'變量顯示在對話框中,'$ item'變量的確是由「foreach」聲明設置(「項目」當然只是一個任意名稱,可以是任何你想要的)。基本上如果你使用get-content,每一行都將是一個數組項,foreach在數組中循環,並且allways將當前項賦給你在語句開始處使用的變量名,在這種情況下'$ item' – Paul

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(或similiar構建體)和一個嵌套條件,是這樣的:

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

我留下它作爲練習,將您選擇的任何提示程序與代碼的其餘部分集成在一起。

+0

謝謝你的明確解釋。從今天我學到了很多東西。你的時間值得讚賞 – CM2K

相關問題