0

無効な日付を見つけて置き換えるために検索している大きなファイルがあります。REGEX 式を使用して日付を見つけ、それらが有効かどうかを判断しています。スクリプトが無効な日付を見つけた場合、日付を現在の日付に置き換える必要があります。監査のために、無効な文字列とエラーが見つかった行番号を記録する必要があります。これまでのところ(SOの事前の助けを借りて)無効な日付を見つけることができましたが、それらを正常に変更することはできませんでした.

これは、無効な日付を見つけるために使用しているコードです。1 回のパスで日付を見つけて変更するにはどうすればよいですか?

$matchInfos = @(Select-String -Pattern $regex -AllMatches -Path $file)
foreach ($minfo in $matchInfos)
{
    #"LineNumber $($minfo.LineNumber)"
    foreach ($match in @($minfo.Matches | Foreach {$_.Groups[0].value}))
    {
        if (([Boolean]($match -as [DateTime]) -eq $false ) -or ([DateTime]::parseexact($match,"MM-dd-yyyy",$null).Year -lt "1800")) {
            Write-host "Invalid date on line $($minfo.LineNumber) - $match"
            #Add-Content -Path $LOGFILE -Value "Invalid date on line $($minfo.LineNumber) - $match"

            # Replace the invalid date with a corrected one
            Write-Host "Replacing $match with $(Get-Date -Format "MM-dd-yyyy")"
            #Add-Content -Path $LOGFILE -Value "Replacing $match with $(Get-Date -Format "MM-dd-yyyy")"

        }
    }
 }
4

2 に答える 2

1

変更を加えた一時ファイルを書き出し、そのファイルを一時ファイルに置き換える必要があります。これが私が書いたもので、あなたのためにその部分を行います:

Windows IT Pro:PowerShellを使用したファイル内の文字列の置換

使用例:

replace-filestring -pattern 'find' -replacement 'replace' -path myfile.txt -overwrite

このコマンドを使用すると、スクリプトはmyfile.txtを読み取り、「find」を「replace」に置き換え、出力を一時ファイルに書き込んでから、myfile.txtを一時ファイルに置き換えます。(-Overwriteパラメーターを指定しない場合、スクリプトは変更されたmyfile.txtの内容のみを出力します。)

明細書

于 2013-02-28T20:38:41.523 に答える
1
$lines = get-content $file
$len = $lines.count
$bad = @{}
for($i=0;$i-lt$len;$i++){
    if($lines[$i] -match ""){
        $bad_date = $lines[$i].substring(10) #Get the bad date
        $good_date = Get-Date -Format G
        $bad["$i"] += @($line[$i])
        $lines[$i] = $lines[$i].Replace($bad_date,$good_date)
    }
}
$lines > $NewFile
$bad > $bad_date_file

これは、この問題に対処する方法の疑似コードです。ファイルの大きさがわからない。読み取りと書き込みが遅くなる可能性があります。

于 2013-02-28T20:53:48.140 に答える