【问题标题】:How can I search all files in a directory for a list of strings(numbers)?如何在目录中的所有文件中搜索字符串(数字)列表?
【发布时间】:2018-03-24 19:04:17
【问题描述】:

我有一个 csv 格式的数字列表,格式如下:

po
123
456
789

我还有一个包含 100 多个文档的目录。我需要检查 csv 中每个字符串的每个文档。如果其中一个数字在其中一个文档中,则需要将其移动到另一个文件中。这是我目前所拥有的:

$files = Get-ChildItem "\\wh1-app\SPS EDI\ARCHIVE IN\*.txt"


foreach ($file in $files) {

    $file = Get-Content $file

    $pos = Import-Csv -Path C:\Users\ttilton\Desktop\pos.csv -OutVariable string -ErrorAction SilentlyContinue

    foreach ($po in $pos) {

       $containsWord = $file | %{$_ -match $po.po}

        if ($containsWord -contains $true){ 

            write-host $file + " is " + $po.po

            #Copy-Item $file C:\Users\ttilton\Desktop\pos\

        }
    }

但它似乎不起作用。它运行没有错误,但它并没有真正做任何事情。

有什么想法吗?谢谢!!

【问题讨论】:

  • 将 ErrorAction 更改为 Stop,这样您就可以看到可能发生的异常。
  • Copy-Item 不会被执行,因为# 会将整行变成注释。
  • @C.Helling 据我了解,代码$containsWord 是一个布尔值数组。有了你的建议,“f”子句永远是正确的。
  • 重用 $file 的名称和内容令人困惑,但总的来说我看不出有什么问题。在 PowerShell ISE 调试器中运行它 - 是否找到任何 *.txt 文件? Import-Csv 是否实际导入任何数据? $po.po 是否成为您期望的正确数字?你可以用$nums = (import-csv ___).po -join '|'; select-string -pattern $nums -path "\\wh1-app\SPS EDI\ARCHIVE IN\*.txt" 做同样的事情
  • @tyTil Select-String 应该明显更快,但是将您的代码更改为使用 $containsWord = $file | ?{$_ -match $po.po} | select -first 1 然后检查 if ($containsWord) 应该会大大减少工作量 - 只测试直到找到第一个东西而不是为每一行保留一些东西。并在每个循环中尝试一些“write-host”,向您显示当前的 $po 和当前 $file,以便您了解它的进展速度。

标签: powershell csv


【解决方案1】:

对于我的测试,它应该可以工作,我猜你的远程位置 (\\wh1-app\SPS EDI\ARCHIVE IN\*.txt) 的(可访问性)有问题,其中包含你的 .txt 文件。

为了解决这个问题,我会将一些源文件放在本地(例如C:\temp\*.txt

或者在你的脚本中添加额外的Write-Host 命令。例如这里:

...
foreach ($file in $files) {
    Write-Host $file.name    # Is there really a file picked up here?
    $file = Get-Content $file
    ...

一些加速你的功能的一般建议:

  • $pos = Import-Csv -Path C:\Users\ttilton\Desktop\pos.csv -OutVariable string -ErrorAction SilentlyContinue 移出foreach ($file in $files) {... 循环,您只需读取.csv 文件一次。
  • 如果找到匹配项,请不要(继续)阅读 .txt$containsWord 中的一个 $True 足以验证 if ($containsWord -contains $true){...。要停止 ForEach 循环,请参阅:https://stackoverflow.com/a/10420522/1701026

【讨论】:

  • 是的,我已经取出一大块文件,现在在本地运行。它仍然很慢,但由于@TessellatingHeckler 在上面的 cmets 中提供的建议,它比以前效果更好。谢谢!
猜你喜欢
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2018-05-05
  • 2016-07-12
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多