我有一个文件共享列表(数十万行),大多数在Excel中完全对齐,我可以使用文本到列进行拆分。但是我遇到了一个问题,因为有一些文件路径在名称中有一个逗号,而是在那里拆分而不是实际所需的分隔符。以下是字符串的示例:
\\\Share\MMMC\MMMC\Employees\Jones, Pat\Payment Vouchers\The Creative Group\Amy DOE\2014\Inv. # 403412 - $671.16 - 5-16-14.xlsm,DOMAIN\YA-MGD , RWXD
\\\Share\MMMC\MMMC\Employees\Jones, Pat\Payment Vouchers\The Creative Group\Amy DOE\2014\Inv. # 403412 - $671.16 - 5-16-14.xlsm,DOMAIN\SGRP-Triple, RWXD
在以上两行开头的\\分享它分裂在琼斯和“,DOMAIN”,然后是最后一个逗号离开完整的共享路径。逗号的数量可以变化到4或5.我只希望它在最后两个逗号中分开。我怎么能以编程方式做到这一点? excel公式或powershell脚本将是理想的。任何帮助将不胜感激。
答案 0 :(得分:1)
PowerShell和RegEx可以做到这一点。这是解释RegEx的链接:
https://regex101.com/r/eW2rP5/2
我将使用的RegEx是^(.+?),([^,]+?),([^,]*)$
。从一行的开头到第二个到最后一个逗号,跳过逗号,然后是所有非逗号字符直到最后一个逗号,再次跳过逗号,所有非逗号字符到达结尾线。每个都是它自己的捕获组,因此我们可以使用自动$Matches
变量来生成PSCustomObject,其中包含每个部分的属性:
@"
\\\Share\MMMC\MMMC\Employees\Jones, Pat\Payment Vouchers\The Creative Group\Amy DOE\2014\Inv. # 403412 - $671.16 - 5-16-14.xlsm,DOMAIN\YA-MGD , RWXD
\\\Share\MMMC\MMMC\Employees\Jones, Pat\Payment Vouchers\The Creative Group\Amy DOE\2014\Inv. # 403412 - $671.16 - 5-16-14.xlsm,DOMAIN\SGRP-Triple, RWXD
"@ -split "`r`n"|Where{$_ -match "^(.+?),([^,]+?),([^,]*)$"}|ForEach{[PSCustomObject]@{"SharePath"=$Matches[1];"User"=$Matches[2].trim();"Rights"=$Matches[3].trim()}}
魔术是Where
语句与RegEx匹配的组合,以及使用这些匹配为每行创建自定义对象的ForEach
循环。你最终得到:
SharePath User Rights
--------- ---- ------
\\\Share\MMMC\MMMC\Employees\Jones, Pat\Payment Vouchers\The Creative Group\Amy DOE\2014\Inv. # 403412 - .16 - 5-16-14.xlsm DOMAIN\YA-MGD RWXD
\\\Share\MMMC\MMMC\Employees\Jones, Pat\Payment Vouchers\The Creative Group\Amy DOE\2014\Inv. # 403412 - .16 - 5-16-14.xlsm DOMAIN\SGRP-Triple RWXD