解析目录中的文件名以使用时间戳输出到csv?

时间:2013-12-21 01:28:21

标签: powershell

我在几个目录中有几百个文档。它们都有一个共同的命名结构,但值不同:

10_03022014_229_14_12-9663 5930 4454.pdf

10_03022014_230_19_4-574 1564 1452 177.pdf

我尝试做的是根据此数据创建CSV,删除一些空格,并删除PowerShell中的PDF文件扩展名。最终结果看起来像这样:

10,03022014,229,14,12,966359304454

10,03022014,230,19,4,57415641452177

除最后一个条形码数据外,所有这些值都是字母数字。

为了让自己更复杂,我需要让输出文件具有类似的命名结构,基于前两个“值”,后跟日期和时间戳。

如果目录中的文件以10_03022014_datestamp_timestamp.csv开头,则示例为10_02022014

非常感谢任何建议!

2 个答案:

答案 0 :(得分:2)

另一种解决方案:

#Get pdf-files
Get-ChildItem -Filter "*.pdf" |
#Group files that belong to the same csv-file
Group-Object -Property @{e={$_.BaseName.Split("_")[0,1] -join ("_")}} |
#Foreach csv-group
ForEach-Object {
    #Generate csv-filename
    $path = "$($_.Name)_$((Get-Date).ToString("MMddyyyy_HHmm")).csv"
    #Format content and save
    $_.Group | % { $_.BaseName -replace " " -replace '[-_]',"," } | Set-Content -Path $path
}

答案 1 :(得分:1)

文件名处理似乎很简单。我相信你只是用逗号替换下划线,连字符并从文件的基本名称中删除空格。以下内容应该为您提供重新格式化的字符串,至少按照您提供的两个值:

Get-ChildItem -Filter '*.pdf' |
    ForEach-Object { $_.BaseName -Replace '[-_]', ',' -Replace ' ', '' }

我仍然不清楚你对csv文件名的意思。一旦你澄清了这一点,我也很乐意为此提供帮助。


我认为这更接近您的目标:

# Generate '_date_time.csv' string.
$fileSuffix = "_" + (Get-Date -Format yyyyMMdd) + "_" + (Get-Date -Format HHmm) + ".csv"

Get-ChildItem -Filter '*.pdf' |
    ForEach-Object {
        # Get the first two tokens, underscore delimited, of PDF file name.
        $filePrefix = $_.Name.Split('_')[0,1] -Join('_')
        # Preform requisite replacements on PDF file name
        $string = $_.BaseName -Replace '[-_]', ',' -Replace ' ', ''
        # Write string out to CSV file, concat prefix/suffix to generate name.
        $string | Out-File -Append -FilePath $($filePrefix + $fileSuffix)
    }