我需要拆分一些文件名来创建报告(文本文档)。我正在研究这个问题,但我的代码变得非常复杂,有一些逻辑我没有开发,可以做得更清洁。
文件命名结构如下所示:
B00D09COGG.MAIN.PC_300_bob.jpg
B00D09COGG.PT01.PC_300_bob.jpg
B00EVI2MPI.MAIN.PC_300_bill.jpg
B01FKFF0OK.BACK.PC_300_bill.jpg
B00GB812OS.MAIN.PC_300_tom.jpg
我想将名称拆分并将第一部分(B00D09COGG
,B00EVI2MPI
,B01FKFF0OK
和B00GB812OS
)写入名为最后一部分的文本文档({ {1}},bob
和bill
)。最终,我需要以每个用户名命名的文本文档,并包含与它们相关联的唯一B00代码。
最终结果应为三个文本文档,标题为tom
,bob
和bill
tom
到目前为止我所拥有的:
bill
----
B00EVI2MPI
B01FKFF0OK
bob
----
B00D09COGG
tom
----
B00GB812OS
这不起作用,我觉得我采取了错误的做法。
答案 0 :(得分:1)
试试这个。使用“添加内容”附加到文件。
$b = GCI 'E:\Temp_Images'
$items = New-Object 'Collections.Generic.HashSet[Tuple[string,string]]'
foreach($d in $b){
$stylist = $d.BaseName.Split("_")[2]
$ASIN = $d.BaseName.Split(".")[0]
$checkTuple = New-Object 'Tuple[string,string]'($stylist, $ASIN)
if ( -not $items.Contains($checkTuple))
{
Add-Content ("E:\Temp_Images\" + $stylist + ".txt") $ASIN
$items.Add($checkTuple)
}
}
答案 1 :(得分:1)
这是另一种方法。它可能需要多一点,但它需要从文件中收集所有信息并输出到每个文本文件一次。
# You see
$rootFolder = "e:\temp_images"
# Use a regex match string to extract the code and name from each file
$regex = "(?<code>\w+)\..*_(?<user>\w+)"
# regex also doubles as a filter for files that do not match the structure
Get-ChildItem $rootFolder | Where-object{$_.BaseName -match $regex} | ForEach-Object{
# Create a custom object of the code and name
[pscustomobject]@{
code = $matches.code
user = $matches.user
}
# Group on user
} | Group-Object user | ForEach-Object{
# Write the unique data to file for this name
$_.Group.Code | Select-Object -Unique | Set-Content -Path "$rootFolder\$($_.Name).txt"
}
你需要至少PSv3才能工作。
它读取文件夹$rootFolder
中的所有结构化文件,并为每个文件创建一个对象。使用您的示例:
code name
---- ----
B00D09COGG bob
B00D09COGG bob
B00EVI2MPI bill
B01FKFF0OK bill
B00GB812OS tom
然后将它们组合在一起:
Count Name Group
----- ---- -----
2 bob {@{code=B00D09COGG; name=bob}, @{code=B00D09COGG; name=bob}}
2 bill {@{code=B00EVI2MPI; name=bill}, @{code=B01FKFF0OK; name=bill}}
1 tom {@{code=B00GB812OS; name=tom}}
之后,很容易隔离每个组中的唯一值并将它们写出到文件中。