Очистка данных CSV с помощью Powershell - PullRequest
0 голосов
/ 03 июля 2019

У меня есть CSV, который содержит информацию о путях к файлам.Полный путь к файлу может быть создан, если я объединю ячейки вместе и добавлю между ними "/".Иногда эти ячейки могут быть пустыми или иметь несколько каталогов в них.Например.Рабочий стол / Папка A / Папка B

Итак, для этого у меня есть скрипт:

Import-Csv -Path 'test.csv'  | 
Select-Object @{Name='Path';Expression={$_.Folder1, "/" ,$_.Folder2, "/",$_.Folder3, "/",$_.Folder4, "/",$_.Folder5, "/", $_.Folder6, -join ','}}    | 
Export-Csv 'OutputTestFile.csv' -NoTypeInformation

Это создает тестовый файл, который выглядит примерно так:

HR Central / / / HR Central / Документы /,

HR Central / Служба сотрудников / / Служба персонала - Внутренняя / Служба персонала / Процедуры / a / b / c,

HR / HRБизнес-партнеры / / Talent & Acquisition - Internal / HR Business Partners /,

Что не позволяет получить чистые пути к файлам из-за двойной косой черты.Пробелы также являются проблемой.Мне даже не нужно экспортировать его обратно в CSV.Мне нужно просто иметь возможность получить список / массив путей к файлам, чтобы я мог создать файловую структуру в среде.

В идеале мне бы хотелось, чтобы пути к файлам выглядели так:

HR / HR-бизнес-партнеры / Таланты и приобретение - Внутренние / HR-бизнес-партнеры /,

HR-центр / HR-центр / Документы /,

Ответы [ 3 ]

1 голос
/ 03 июля 2019

Другой вариант:

foreach ( $csvLine in $(Import-Csv -Path 'test.csv')) {
    $rawPath = $csvLine | Select-Object @{
        Name='Path';
        Expression = { @( $_.Folder1, 
                          $_.Folder2, 
                          $_.Folder3, 
                          $_.Folder4, 
                          $_.Folder5, 
                          $_.Folder6) -join '/'
                    }
        }
    # remove multiple solidi
    $rawPath.Path.Split(
         '/', 
         [System.StringSplitOptions]::RemoveEmptyEntries) -join '/'
} 
1 голос
/ 08 июля 2019

Это может быть довольно коротко, если вы используете PSObject. Если вам нужен массив путей, я бы сделал это в цикле ForEach-Object:

Import-Csv test-csv | Select Folder[1-6] | ForEach-Object {
    $_.psobject.Properties.where({$_.Name -match '^Folder[1-6]$' -and !([string]::IsNullOrWhiteSpace($_.Value))}).Value -join '/' -replace '(?<=/) | (?=/)'}
}
1 голос
/ 03 июля 2019

Один из многих вариантов:

Import-Csv -Path 'test.csv' |
    Select-Object @{
        Name = 'Path'
        Expression = {
            $row = $_
            $folders = @()
            1..6 | ForEach-Object {
                $folder = $row."Folder$_"
                if ($folder -and -not ([String]::IsNullOrEmpty($folder.Trim())))
                {
                    $folders += $folder.Trim()
                }
            }
            return $folders -join "/"
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...