我有多个CSV文件,它们的名称不同,分别包含今天的日期,客户编号和扩展名。例如:
2019-01-23 XYZF-105.csv
2019-01-23 ABCD-205.csv
2019-01-23 Different nonstandard name.csv
2019-01-23 ##ABCD-305(Trial).csv
我想得到的名称中仅包含客户编号的部分,例如ABCD-305。
尝试使用子字符串从点中选择8个字符,但这不适用于带有(Trial)后缀的字符。 从一开始它都不起作用11个字符,因为它将包含##。 同样,它必须避免使用非标准名称。
我用过
$allitems = Get-ChildItem -Path 'C:\Downloads\Customers\*.csv'
$res = @()
foreach ($item in $allitems){
$item = $item.Name.substring($item.Name.Length - 12,8)
$res += $Item
}
这样,对于专有名称,我会得到很好的结果,但前提是CSV的名称类似于2019-01-23 ABCD-205.csv。
应该如何跳过日期,跳过.csv扩展名并仅获取8个字符(第4个字符后带有破折号)的结果? 预先感谢
答案 0 :(得分:2)
尝试以下操作(PSv3 +语法):
$res = (Get-ChildItem -Path C:\Downloads\Customers\*.csv).Name |
Select-String -CaseSensitive '\b[A-Z]{4}-\d{3}\b' |
ForEach-Object { $_.Matches[0].Value }
(Get-ChildItem -Path C:\Downloads\Customers\*.csv).Name
在dir中输出所有CSV文件的文件名。 C:\Downloads\Customers
Select-String -CaseSensitive '\b[A-Z]{4}-\d{3}\b'
使用区分大小写的正则表达式(正则表达式)匹配来仅选择包含4个({4}
)大写字符的文件名。 [A-Z]
,后跟-
,后跟3个数字(\d
),位于字边界(\b
)
然后,ForEach-Object
脚本块输出与正则表达式($_.Matches[0].Value
)匹配的每个匹配文件名的一部分,以便仅将匹配文件名的相关部分收集在{{ 1}},作为数组。
答案 1 :(得分:1)
这是使用正则表达式的好时机。 参见https://regex101.com/r/AH00n6/1
并了解以下正则表达式:
.*\s[#]*([A-Z]{4}-[0-9]{3}).*.csv
这只是捕获名称的一个额外功能,但可以让您更深入地了解如何控制正则表达式。