根据FileName将拆分FileName的一部分写入doc

时间:2018-02-01 19:53:25

标签: powershell split

我需要拆分一些文件名来创建报告(文本文档)。我正在研究这个问题,但我的代码变得非常复杂,有一些逻辑我没有开发,可以做得更清洁。

文件命名结构如下所示:

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

我想将名称拆分并将第一部分(B00D09COGGB00EVI2MPIB01FKFF0OKB00GB812OS)写入名为最后一部分的文本文档({ {1}},bobbill)。最终,我需要以每个用户名命名的文本文档,并包含与它们相关联的唯一B00代码。

最终结果应为三个文本文档,标题为tombobbill

tom

到目前为止我所拥有的:

bill
----
B00EVI2MPI
B01FKFF0OK

bob
----
B00D09COGG

tom
----
B00GB812OS

这不起作用,我觉得我采取了错误的做法。

2 个答案:

答案 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}} 

之后,很容易隔离每个组中的唯一值并将它们写出到文件中。