我已经在网上搜索了我的问题的以下解决方案...我目前有一个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号。我想从名字中删除该号码,如第二张图片所示
“项目”列基本上包含分成6列所需的所有数据。我相信必须有一种以编程方式选择文本的方法。我会一次一点地进入它。 “客户ID”列应包含“项目列”中第一个空格之前的数字。这可能包含单个数字或双位数字。无论如何,该数字应始终存在于“Project”中的第一个空白空间之前。作为明显的新手,我能够使用-split参数
来完成它@ {Name =“Customer 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
客户名称:新科技建筑公司 家长项目ID:001583
家长项目名称:2013 Panhandle
儿童项目编号:001810
儿童项目名称:JA03MR008
我参加了REGEX的速成课程,这是我认为最适合我的目的。请参阅下面的代码。它看起来很棒。这样使用它有什么警告吗?提前致谢
Add-Member -PassThru NoteProperty 'Task Name' -Value ($_.'Task Name' -replace '^([^-]*) - ')
答案 0 :(得分: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。