【问题标题】:Cleaning up CSV Data Using Powershell使用 Powershell 清理 CSV 数据
【发布时间】:2019-07-03 14:42:15
【问题描述】:

我有一个包含文件路径信息的 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 / 员工服务 / / 员工服务 - 内部 / 员工服务/程序/a/b/c,

人力资源 / 人力资源业务合作伙伴 / / 人才与招聘 - 内部 / 人力资源 商业伙伴 / ,

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

理想情况下,我希望文件路径如下所示:

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

HR Central/HR Central/Documents/,

【问题讨论】:

  • 查看Join-Path cmdlet。 [grin] 它知道路径分隔符,并会为你处理特定的故障......

标签: powershell csv


【解决方案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】:

许多选项之一:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      • 2021-09-29
      • 2019-05-28
      • 1970-01-01
      相关资源
      最近更新 更多