Powershell фильтрует список по имени и дате - PullRequest
1 голос
/ 05 марта 2020

Мне нужна помощь ... Я новичок в powershell и хочу отфильтровать список (CSV). Я хотел бы удалить все строки с определенными именами в нем. и сократить список до последнего месяца. В сценарии вы можете увидеть, как далеко я дошел до сих пор.

param(

    [Parameter(ValueFromPipeline=$true,HelpMessage="Enter CSV path(s)")]
    [String[]]$Path = $null
)



if($Path -eq $null) {

    Add-Type -AssemblyName System.Windows.Forms

    $Dialog = New-Object System.Windows.Forms.OpenFileDialog
    $Dialog.InitialDirectory = "$InitialDirectory"
    $Dialog.Title = "Select CSV File(s)"
    $Dialog.Filter = "CSV File(s)|*.csv"        
    $Dialog.Multiselect=$true
    $Result = $Dialog.ShowDialog()

    if($Result -eq 'OK') {

        Try {

            $Path = $Dialog.FileNames
        }

        Catch {

            $Path = $null
            Break

        }
    }

    else {


        Write-Host -ForegroundColor Yellow "Notice: No file(s) selected."
        Break
    }
}

$info=Import-Csv "$path" -Delimiter ';'
$info | Get-Member 
$info | Format-Table

, как вы можете видеть, я пытался связать путь к браузеру файлов.

Ответы [ 4 ]

1 голос
/ 05 марта 2020

В целях обсуждения я буду предполагать, что полный путь к CSV находится в переменной $InputPath, и что вы хотите записать результат в файл CSV, полный путь которого находится в переменной $OutputPath. Я также предполагаю, что файл CSV содержит столбец с именем «Имя», а значение из столбца «Имя», которое вы хотите исключить, находится в переменной $ExcludedName. Учитывая это, вы можете просто сделать

Import-CSV -Path $InputPath | Where-Object {$_.Name -ne $ExcludedName} | Export-CSV -Path $OutputPath -NoTypeInformation
0 голосов
/ 05 марта 2020

Попробуйте сначала без использования функции:


Import-Csv <Filename> | Where-Object {$_.<FieldName> -notlike "*<Value>*"}

Также вы можете рассмотреть что-то вроде этого:

[CmdletBinding()]
param (
    [Parameter(ValueFromPipeline = $true, HelpMessage = "Enter CSV path(s)")]
    [String[]]$Path = $(
        Add-Type -AssemblyName System.Windows.Forms
        $DialogProperties = @{
            Title       = 'Select CSV File(s)'
            Filter      = 'CSV File(s)|*.csv'
            Multiselect = $True
        }

        $Dialog = New-Object System.Windows.Forms.OpenFileDialog -Property $DialogProperties
        $Dialog.ShowDialog()

        If ($Result -eq 'OK') {
            $Path = $Dialog.FileNames
        } Else {
            Write-Error 'Notice: No file(s) selected.'
        }
    )
)

Process {
    ForEach ($PathItem in $Path) {
        Import-Csv $PathItem | Where-Object { $_.Name -notlike "*NotThisOne*" }
    }
}
0 голосов
/ 05 марта 2020

Вы можете сделать это с помощью моего кода, но не забывайте, что первая строка должна содержать имена столбцов , а разделитель должен быть ';' $nameslist - массив имен, которые вам нужно удалить:

$info=Import-Csv "D:\testdir\file2.csv" -Delimiter ';'
$nameslist=@('James','John','andrew')
foreach($i in $info){
    if($nameslist -contains $i.Name){
    $i.Name=""    
    }
    $i|Export-Csv -Path "D:\testdir\file1.csv"  -Delimiter ';' -NoTypeInformation -Force -Encoding UTF8 -Append   
}
0 голосов
/ 05 марта 2020

Попробуйте это:

$data = Import-Csv "Path" | Select-Object * -ExcludeProperty Names 
$data | export-csv "Path" -Notype

Это сократит имена столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...