1

我已经在网上搜索了我的问题的以下解决方案...我目前有 csv 格式的文本,我需要将其分成几列,如下所示

Task ID,Task Name,Project                   
2,2 - CR04AW212 Warehouse,2 Crown Castle International : 001586 2013 ALU Phase 3 Sprint Crown : 001623 CR04AW212 ALU Sprint                 
10,10 - CR04AW090 Tower Punch,24 Alcatel Lucent : 001713 2013 ALU AAV : 001752 CR04AW090 ALU AAV

我需要翻译\分解成几列拉开文本,如下所示

Task ID,Task Name,Customer ID,Customer Name,Parent Project ID,Parent Project Name,Child Project ID,Child Project Name
2,CR04AW212 Warehouse,2,Crown Castle International,001586,2013 ALU Phase 3 Sprint Crown 001623,CR04AW212 ALU Sprint
10,CR04AW090 Tower Punch,24,Alcatel Lucent,001713,2013 ALU AAV,001752,CR04AW090 ALU AAV

任务 ID 号在任务名称中再次出现重复。我想从名称中删除该数字,如第二张图片所示

Project 列实质上包含分成 6 列所需的所有数据。我相信必须有一种以编程方式选择文本的方法。我将一次一点地进入它。“客户 ID”列应包含“项目列”中第一个空格之前的数字。这可以由一位数或两位数组成。无论如何,该数字应始终存在于“项目”中的第一个空格之前。作为一个明显的新手,我能够使用 -split 参数来完成它

@{Name="客户 ID";Expression={($_.Project -split ' ')[0]}}。

现在我必须选择以下文本“客户名称”,该文本将始终存在于第一个空格之后和“:”之前。

此示例再持续 2 次。“父项目 ID”和“子项目 ID”是固定的 6 位数字。每个 ID 后面的文本表示为该项目的名称。

这是我的谷歌搜索已经用尽的地方

我很抱歉没有上传图片,我刚刚注册了 StackOverflow 直到我有足够的信誉才允许我这样做:)

编辑:如何在第一场比赛后退出?

Add-Member -PassThru NoteProperty 'Task Name' -Value ($_.'Task Name' -replace '\d+ - ')

此刻如果我有

1,1 - JA03MR008 - Civil,9 New Tech Construction Corp. : 001583 2013 Panhandle : 001810 JA03MR008"

当我想删除“任务名称”中的第一个匹配项时,它会导致删除所有匹配项

任务 ID:1
任务名称:JA03MRCivil
客户 ID:9
客户名称:New Tech Construction Corp.
父项目 ID:001583
父项目名称:2013 Panhandle
子项目 ID:001810
子项目名称:JA03MR008

为此,我参加了 REGEX 速成课程,我认为这对我的目的最有效。请参阅下面的代码。它似乎工作得很好。以这种方式使用它有什么警告吗?提前致谢

Add-Member -PassThru NoteProperty 'Task Name' -Value ($_.'Task Name' -replace '^([^-]*) - ')
4

1 回答 1

1

可能有很多方法可以给这只猫换皮,我建议使用正则表达式来处理输入对象的 Project 属性:

@"
Task ID,Task Name,Project
2,2 - CR04AW212 Warehouse,2 Crown Castle International : 001586 2013 ALU Phase 3 Sprint Crown : 001623 CR04AW212 ALU Sprint
10,10 - CR04AW090 Tower Punch,24 Alcatel Lucent : 001713 2013 ALU AAV : 001752 CR04AW090 ALU AAV
"@ | ConvertFrom-Csv | ForEach-Object {
    if ($_.Project -match '(\d+) ([^:]+) : (\d+) ([^:]+) (: (\d+) (.*))?') {
        $_ | select 'Task ID' |
            Add-Member -PassThru NoteProperty 'Task Name' -Value ($_.'Task Name' -replace '\d+ - ') |
            Add-Member -PassThru NoteProperty 'Customer ID' -Value $Matches[1]                      |
            Add-Member -PassThru NoteProperty 'Customer Name' -Value $Matches[2]                    |
            Add-Member -PassThru NoteProperty 'Parent Project ID' -Value $Matches[3]                |
            Add-Member -PassThru NoteProperty 'Parent Project Name' -Value $Matches[4]              |
            Add-Member -PassThru NoteProperty 'Child Project ID' -Value $Matches[6]                 |
            Add-Member -PassThru NoteProperty 'Child Project Name' -Value $Matches[7]

    }
}

这可能需要在这里和那里进行一些抛光。例如,您可以使用 select-object + hashtables 而不是 Add-Member。在 v3 中会容易得多,但我认为这必须与 v2 兼容,因此不使用 v3 代码。

编辑: 用没有子项目时能够处理选项的代码更新了代码,新的正则表达式:

 '(\d+) ([^:]+) : (\d+) ([^:]+) (: (\d+) (.*))?'

它正在制作最后两部分:: (\d+)(.*)可选:(pattern)? $Matches[5] 将是空白,或者将包含可选组,因此您需要将子项目属性的索引更改为 6 和 7。

于 2013-03-04T22:20:18.877 回答