【问题标题】:Looping through CSV to write error logs循环通过 CSV 写入错误日志
【发布时间】:2023-03-15 05:22:01
【问题描述】:

我正在处理一个文本文件(称为list_names.txt),其中包含逗号分隔值,格式如下:

"旧名称.pdf","新名称.pdf" “旧名称2.pdf”、“新名称2.pdf” ...

new_name 列的值应该是字母后跟数字(例如:abcd_12.pdf),但其中一些记录错误并且只在下划线后面包含数字(例如:_12.pdf)。

我想制作一个错误日志,记录所有出现此错误的行,我尝试为它编写一个脚本。

$myHeader = echo OldName NewName

$csv = Import-Csv $PSScriptRoot\list_names.txt -Header $myHeader
foreach ($line in $csv) {
    if ($line.NewName -eq "`"`_[0-9]*.pdf`"") {
        Add-Content -Path $PSScriptRoot\ocr_error.txt -Value "ERROR reading $line.FileName"
    }
}

当我运行它时,ocr_error.txt 中没有输出。

【问题讨论】:

  • 如答案所示,使用-match 比较运算符。此外,请使用单引号字符串文字,这样您就不必担心转义双引号。

标签: regex powershell csv logging import


【解决方案1】:

您需要使用-Match 并将您的正则表达式更改为'^_\d*\.pdf$'。您还需要使用子表达式运算符$() 来访问错误输出行中$line 变量的属性:

$myHeader = echo OldName NewName
$csv= Import-Csv $PSScriptRoot\list_names.txt -Header $myHeader 

Foreach ($line in $csv) {
    if ($line.NewName -match '^_\d*\.pdf$') {
        Add-Content -path $PSScriptRoot\ocr_error.txt -Value "ERROR reading $($line.OldName)" 
    }
}

-Match 比较运算符允许您使用正则表达式,而 -Eq 则不允许。

您不需要在 RegEx 中包含语音标记,因为它们会被 Import-CSV 自动删除。

根据 Ansgar 的评论,RegEx 模式 '^_\d*\.pdf$' 确保它仅匹配字符串的开头 _ 后跟任意数量的数字(现在由正则表达式标记 \d 而不是大于数字范围)并以.pdf 结尾(其中\ 需要继续. 以阻止它被解释为RegEx 令牌)。

【讨论】:

  • 需要在字符串的开头锚定正则表达式,否则像abcd_12.pdf 这样的文件名也会被匹配。我建议使用^_\d*\.pdf$ 以避免意外。
  • 谢谢 Ansgar,我已经修改了。
  • 附加说明:他也试图抓住双引号,所以它应该是'^"_\d*\.pdf"$'。如果他在 PSv2 上,由于某种原因,匹配开始/结束在 Select-String -Pattern 之外不起作用。
  • 我相信 import-csv 会删除双引号。
  • 我刚刚测试过,你的假设是正确的@MarkWragg 关于引号。然而,关于 PSv2 的观点仍然存在。在某些特定用例中,我不得不一起使用开始/结束边界,但它们不适用于 -match 运算符
猜你喜欢
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 2019-05-12
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多