【问题标题】:Pulling a substring for each line in file为文件中的每一行提取一个子字符串
【发布时间】:2014-09-23 15:54:57
【问题描述】:

使用 Powershell,我只是想从任何以 6 开头的记录的第 37 位开始提取 15 个字符。我想循环并为每个实例生成一个记录,以便以后可以将其放入输出文件。但我似乎并没有使用正确的语法来返回我知道我遗漏了一些明显的 15 个字符。有一段时间了。这是我的脚本:

$content = Get-Content -Path .\tmfhsyst*.txt | Where-Object { $_.StartsWith("6") }

foreach ($line in $contents) 
{
  $val102 = $line.substring(36,15)
}

write-output $val102

【问题讨论】:

  • 你能解释什么是错的吗?您是否收到任何错误消息或看到不正确的结果?
  • 您的write-output 不应该在foreach 循环内吗?

标签: powershell foreach substring


【解决方案1】:

正如 Bill_Stewart 指出的那样,您需要将 Write-Output 行移到 ForEach 循环内。一个可能更好的方法就是管道它:

Get-Content -Path .\tmfhsyst*.txt | Where-Object { $_.StartsWith("6") } | foreach{$_.substring(36,15)}

这应该会给你你想要的输出。

【讨论】:

  • 非常感谢!这在数组中创建了子字符串。它运作良好。现在我需要为每个返回值创建一个变量。变量为 $val102。这只是作为 $line 子字符串的几个变量之一。因此,例如,$val013 可以是 substring(5,4)。最终输出看起来像: write-output "102,$val102" write-output "103,$val103"
【解决方案2】:

使用Substring() 的缺点是如果字符串短于起始索引+ 子字符串长度会引发错误。您可以通过正则表达式匹配来避免这种情况:

(Get-Content -Path .\tmfhsyst*.txt) -match '^6.{35}(.{15})' | % { $matches[1] }

【讨论】:

    猜你喜欢
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    相关资源
    最近更新 更多