根据文件中每行文本中的第一个字符附加文本

bil*_*man 3 powershell text append

我有一个需要操作的文本文件。文本文件中的示例数据如下所示:

C02324R
C02645R
F06487R
F05564R
S09687R
J03345R
Run Code Online (Sandbox Code Playgroud)

这是需要发生的事情——

  1. 遍历文本文件中的每一行
  2. 如果第一个字符是“C”,则将“3”附加/添加到文本行的末尾。
  3. 如果第一个字符是“S0”,则在文本行的末尾附加/添加“4”。
  4. 如果第一个字符是“S1”,则在文本行末尾附加/添加“5”。
  5. 如果第一个字符是“F”,则在文本行末尾附加/添加“5”。
  6. 如果第一个字符是“J”,则在文本行末尾附加/添加“6”。

因此,最终结果数据将如下所示——

C02324R3
C02645R3
F06487R5
F05564R5
S09687R5
J03345R6
Run Code Online (Sandbox Code Playgroud)

我可以轻松地在 vba excel 中编写此内容,但我对 powershell 缺乏经验。我尝试过 switch、foreach 和 case 语句,大部分来自借用的代码,但似乎无法使其工作。这是我尝试过的一种方法——

switch -file 'C:\MyFile.txt'
    {
        $_.StartsWith("C")  {$_ +  "3"}
        $_.StartsWith("S0")  {$_+  "4"}
        $_.StartsWith("S1")  {$_ +  "5"}
        $_.StartsWith("J")  {$_ +  "6"}
    }
    $data | Set-Content C:\MyFile.txt -Force*
Run Code Online (Sandbox Code Playgroud)

建议?

Mat*_*sen 6

要使用任意表达式(例如调用StartsWith())作为 case 谓词来实现此功能,您需要将表达式括在脚本块中:

$data = switch -file 'C:\MyFile.txt'
{
    {$_.StartsWith("C")}  {$_ + "3"}
    {$_.StartsWith("S0")} {$_ + "4"}
    {$_.StartsWith("S1")} {$_ + "5"}
    {$_.StartsWith("J")}  {$_ + "6"}
}
Run Code Online (Sandbox Code Playgroud)

作为替代方案,我个人建议使用-wildcard模式选项:

$data = switch -wildcard -file 'C:\MyFile.txt'
{
    "C*"  {$_ + "3"}
    "S0*" {$_ + "4"}
    "S1*" {$_ + "5"}
    "J*"  {$_ + "6"}
}
Run Code Online (Sandbox Code Playgroud)

更容易阅读:)


正如Theo善意指出的那样,您可能需要添加一个default案例,让不匹配的字符串按原样传递(使用 bareword label default,无论{}模式如何):

$data = switch -wildcard -file 'C:\MyFile.txt'
{
    "C*"  {$_ + "3"}
    "S0*" {$_ + "4"}
    "S1*" {$_ + "5"}
    "J*"  {$_ + "6"}
    default { $_ }
}
Run Code Online (Sandbox Code Playgroud)