我有一个大文件,我正在搜索以查找和替换无效日期。我正在使用REGEX表达式来查找日期,然后确定它们是否有效。如果脚本找到无效日期,则需要将日期替换为当前日期。出于审计目的,我需要记录无效字符串和发现错误的行号。到目前为止(事先有一些帮助)我已经找到了无效的日期,但我无法成功更改它们。
这是我用来查找无效日期的代码。如何在一次通过中找到并更改日期?
$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")"
}
}
}
答案 0 :(得分:1)
您必须写出包含更改的临时文件,并将文件替换为临时文件。这是我写的一篇将为你做的部分:
Windows IT Pro: Replacing Strings in Files Using PowerShell
使用示例:
replace-filestring -pattern 'find' -replacement 'replace' -path myfile.txt -overwrite
使用此命令,脚本将读取myfile.txt,将'find'替换为'replace',将输出写入临时文件,然后将myfile.txt替换为临时文件。 (如果没有 -Overwrite 参数,脚本将仅输出带有更改的myfile.txt的内容。)
比尔
答案 1 :(得分:0)
$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
以下是我将如何解决此问题的一些伪代码。不确定你的文件有多大。阅读和写作可能很慢。