2016-01-04 9 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

Ok человек здесь вы идете:

$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 = @()' to n добавляется элемент, который попадает в предложение if для да. Но как линия создается как элемент. Я смотрю на 'foreach ($ item in $ f)', но я не получаю его полностью – CM2K

+0

@ CM2K строка отображается в диалоговом окне с помощью переменной '$ item', переменная' $ item' действительно установленный оператором 'foreach' (« item »- это, конечно, только произвольное имя, может быть все, что вы хотите). в основном, если вы используете get-content, каждая строка будет элементом массива, foreach циклами через массив и всегда присваивает текущему элементу имя переменной, которое вы используете в начале инструкции, в этом случае '$ 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 (или похожую конструкцию) и вложенный условный, как это:

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