Где-объект оставляя пустые строки - PullRequest
0 голосов
/ 25 октября 2018

Я снова застрял на чем-то, что должно быть таким простым.У меня есть файл CSV, в котором мне нужно сделать несколько строковых изменений и экспортировать их обратно.Данные выглядят так:

FullName
--------

\\server\project\AOI
\\server\project\AOI\Folder1
\\server\project\AOI\Folder2
\\server\project\AOI\Folder3\User

Мне нужно сделать следующее:

  • Удалить «\\ сервер \ проект» из каждой строки, но оставить оставшуюся часть строки
  • Удалить все строки, у которых нет папки (например, в приведенном выше примере первая строка будет удалена, а остальные три останутся)
  • Удалить любую строку со словом «Пользователь»"в пути
  • Добавить столбец с именем T / F со значением" FALSE "для каждой записи

Вот моя первоначальная попытка:

Get-Content C:\Folders.csv |
    % {$_.replace('\\server\project\','')} |
    Where-Object {$_ -match '\\'} |
    #Removes User Folders rows from CSV
    Where-Object {$_ -notmatch 'User'} |
    Out-File C:\Folders-mod.csv

Это работает в определенной степени, за исключением того, что удаляет строку заголовка, и я не нашел способа добавить столбец с помощью Get-Content.Для этого я должен использовать Import-Csv, что нормально, но кажется неэффективным постоянно перезагружать один и тот же файл.Поэтому я попытался переписать вышеупомянутое, используя Import-Csv вместо Get-Content:

$Folders = Import-Csv C:\Folders.csv
foreach ($Folder in $Folders) {
    $Folder.FullName = $Folder.FullName.Replace('\\server\AOI\', '') |
        Where-Object {$_ -match '\\'} |
        Where-Object {$_ -notmatch 'User Files'}
}
$Folders | Export-Csv C:\Folders-mod.csv -NoTypeInformation  

Я еще не добавил код для добавления нового столбца, но это сохраняет заголовок.Тем не менее, я получаю кучу пустых строк, где Where-Object удаляет строку, и единственный способ найти способ избавиться от них - запустить выходной файл с помощью команды Get-Content.Все это кажется слишком сложным для чего-то, что должно быть простым.

Итак, что мне не хватает?

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Я бы сделал это с помощью таблицы Array и pscustomobject.

#Create an empty Array
$Table = @()

#Manipulate the data
$Fullname = Get-Content C:\Folders.csv | 
    ForEach-Object {$_.replace('\\server\project\', '')} | 
    Where-Object {$_ -match '\\'} | 
#Removes User Folders rows from CSV
Where-Object {$_ -notmatch 'User'}

#Define custom objects
Foreach ($name in $Fullname) {
    $Table += [pscustomobject]@{'Fullname' = $name; 'T/F' = 'FALSE'}
}

#Export results to new csv
$Table | Export-CSV C:\Folders-mod.csv -NoTypeInformation
0 голосов
/ 26 октября 2018

вот еще другой способ сделать это ... [ ухмылка ]

$FileList = @'
FullName

\\server\project\AOI
\\server\project\AOI\Folder1

\\server\project\AOI\Folder2
\\server\project\AOI\Folder3\User
'@ | ConvertFrom-Csv

$ThingToRemove = '\\server\project'

$FileList |
    Where-Object {
        # toss out any blank lines
        $_ -and
        # toss out any lines with "user" in them
        $_ -notmatch 'User'
        } |
    ForEach-Object {
        [PSCustomObject]@{
            FullName = $_.FullName -replace [regex]::Escape($ThingToRemove)
            'T/F' = $False
            }
        }

вывод ...

FullName       T/F
--------       ---
\AOI         False
\AOI\Folder1 False
\AOI\Folder2 False

примечания ...

  • добавление косой черты в имя свойства - это ... icky [ ухмылка ]
    , которое требует заключать имя свойства в кавычки каждый раз, когда вам нужнодоступ к нему.попробуйте другое имя - возможно, «исправить».
  • вы можете протестировать пустые элементы массива [строк] с помощью $_ все самостоятельно
  • материал [regex]::Escape() действительно очень удобен
0 голосов
/ 26 октября 2018

Спасибо TheMadTechnician за указание на то, что я делаю неправильно.Вот мой последний скрипт (с добавленным дополнительным столбцом):

$Folders= Import-CSV C:\Folders.csv 
ForEach ($Folder in $Folders)
 {
    $Folder.FullName = $Folder.FullName.replace('\\server\project\','') 
 } 
$Folders | Where-Object {$_ -match '\\' -and $_ -notmatch 'User'} |
Select-Object *,@{Name='T/F';Expression={'FALSE'}} |
Export-CSV C:\Folders.csv -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...