使用Powershell清理CSV数据

时间:2019-07-03 14:42:15

标签: powershell csv

我有一个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 /文档/,

     

人力资源中心/员工服务/ /员工服务-内部/   员工服务/程序/ a / b / c,

     

人力资源/人力资源业务合作伙伴/ /人才与收购-内部/人力资源   业务合作伙伴/,

由于双斜杠,因此没有使用干净的文件路径。空间也是一个问题。我什至不需要将其导出回CSV。我只需要能够捕获文件路径的列表/数组,以便可以在环境中创建文件结构。

理想情况下,我希望文件路径看起来像这样:

  

HR / HR业务合作伙伴/人才与收购-内部/ HR业务   合作伙伴/,

     

HR Central / HR Central / Documents /,

3 个答案:

答案 0 :(得分:1)

众多选项之一:

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 "/"
        }
    }

答案 1 :(得分:1)

另一个选择:

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 '/'
} 

答案 2 :(得分:1)

如果您使用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 '(?<=/) | (?=/)'}
}