首页 > 解决方案 > 如何根据文件名从多个 .txt 文件中提取字符串并将它们附加到 Powershell 上的新文件中?

问题描述

所以基本上我有一系列遵循相同命名法的 .txt 文件,例如:

1111210803_3CE_080977851__006908818__21110300013442021110420211105_20211110_120447_35418862_820

1111210933_3CE_006908818__2111040001442021110520211108_20211110_120447_35418860_820

这些所有文件的命名约定总是以日期开头,即111121. 在这些文件中,您有几行字符串。我有兴趣从每个文件的第一行中提取一个特定的字符串。这是第一行的示例:

123456789012345678901234567890123 I             696969CCHKCTX       12345678901   DA 22758287

特别是,我对696969CCHKCTX字符串感兴趣。所有文件都会有一些数字,后跟CCHKCTX值。我想从每个 .txt 文件中提取字符串的696969一部分696969CCHKCTX并将它们全部附加到一个新文件中。

如果可能的话,我想对这些字符串求和并添加适当的小数位,因为它们实际上是美元值,即696969实际代表6969.69并且该字符串中的最后两个数字始终代表美分金额。此规则适用于所有 .txt 文件。我希望能够将此应用于相同日期的所有文件(即所有以 开头的文件111121

我该怎么办?

标签: powershellappendscript

解决方案


尝试以下组合Get-ChildItem, Group-Object, 和ForEach-Object, 以及-replace运算符:

Get-ChildItem -File | # get files of interest; add path / filter as needed.
  Group-Object { $_.Name.Substring(0, 6) } | # group by shared date prefix
    ForEach-Object {
      $firstLines = $_.Group | Get-Content -First 1 # get all 1st lines
      # Extract the cents amounts and sum them.
      $sumCents = 0.0
      $firstLines.ForEach({ 
        $sumCents += [double] ($_ -replace '.+\b(\d+)CCHKCTX\b.+', '$1') 
      })
      # Output an object with the date prefix and the sum dollar amount.
      [pscustomobject] @{
        Date = $_.Name
        Sum = $sumCents / 100
      }
    }

以上将表格格式的表示输出到显示器。>例如,您可以使用/将其保存到文件中Out-File,但最好使用结构化文本格式以供以后处理,例如Export-Csv.


推荐阅读