如何在固定位置替换多个文本文件中的日期,但仅在原始日期来自过去一个月时

时间:2014-10-27 14:26:00

标签: powershell scripting

我在PowerShell中的脚本编写越来越好,但我仍然是新手,我在寻找解决方案时遇到了问题..

我有一组文本文件(没有结尾)从" in"中的金融系统导出。夹。 内容的行总是具有相同的结构和长度。

在每个行的字符位置72-77是格式为YYMMDD的日期。 我需要用固定值替换这个日期:YY =实际年份,MM =实际月份,DD = 01 但前提是原始日期是过去一个月。 然后我必须将所有修改过的文件写入" out"文件夹中。

数据的外观如何:

00201079980000000000000000007719308672900000286850040040014092914092914093000923000100000000000000

我需要更换" 140930" (字符位置72-77)因为9月(09)已经过了" 141001"。

2 个答案:

答案 0 :(得分:0)

在PowerShell中肯定有这样做的方法,虽然我(以及其他许多人)可以帮助您编写脚本来执行此操作,但我会建议您下载PowerShell社区扩展。它现在(截至2014年10月24日)有一个名为Edit-File的cmdlet,它完全符合您的要求。这可以很简单:

get-childitem c:\path\to\files\*.txt |
    Where{(Get-Content $_.FullName -TotalCount 1).substring(73,2) -lt (get-date -f "MM")}|
        Edit-File -pattern '(?s)((?<=^.{71})\d{6})' -replacement (Get-date -f "yyMM01") -force

答案 1 :(得分:0)

谢谢@Paul和@TheMadTechnician。 我确实看过.substring()并想出了这个,它运行正常。 现在我还有一个问题: 始终不应处理每个文件的最后一行,如何以最简单的方式执行此操作?

&#13;
&#13;
$PathIn = "C:\in\"
$PathOut = "C:\out\"

Get-ChildItem $PathIn * -recurse |
    Foreach-Object {
        $file = ($_ | Get-Content)
        
        write-host $_
        $CompletePathOut = $PathOut + $_
        $LineNumber = 1
        
        foreach($line in $file)
        {
            $LineNumber++
            $OrigValutaDate = $line.Substring(71,6)
            $Before = $line.Substring(0,71)
            $After = $line.Substring(77)
                        
            $d = Get-Date
            
            if ($OrigValutaDate.Substring(2,2) -ne ($d.Month).ToString())
                {
                $NewValutaDate = ($d.Year).ToString().Substring(2,2) + ($d.Month).ToString() + "01"
                $out = $Before + $NewValutaDate + $After
                }
            else
                {
                $out = $Before + $OrigValutaDate + $After
                }
                
            if ($out -eq $line) {write-host $LineNumber "Valutadate original"} else {write-host $LineNumber "Valutadate replaced"}
            $out | out-file -filepath $CompletePathOut -append 
            
        }
        
    }
&#13;
&#13;
&#13;