String 拆分多行字符串组并输出选定字段

String 拆分多行字符串组并输出选定字段,string,powershell,String,Powershell,该文件包含大量数据,如下所示: ______________________________________________________________________ . 1-9/16 TCS DRILL . CUT = +2.685 / O/A = -2.685 . +2.685 / -2.685 . +3.935 / -3.935

该文件包含大量数据,如下所示:

______________________________________________________________________

.         1-9/16 TCS DRILL                  

.          CUT = +2.685 / O/A = -2.685
.                +2.685 /       -2.685
.                +3.935 /       -3.935


______________________________________________________________________

.         1-11/32 TCS DRILL                  

.          CUT = +0.9 / O/A = -3.237
.                +0.9 /       -3.237
.                +0.9 /       -4.487


______________________________________________________________________

.         1-11/32 TCS DRILL                  

.          CUT = +5.699 / O/A = -5.699


______________________________________________________________________

.         1-1/8 TCS DRILL                  

.          CUT = +1.553 / O/A = -1.553
.                +2.338 /       -2.338
.                +2.513 /       -2.513


______________________________________________________________________

.         1-1/16 TCS DRILL                  

.          CUT = +3.587 / O/A = -8.074

但是,我还希望在每个下划线行之后保留第一行文本,同时在每个分割组中输出其余文本行。但是每组的文本行数不确定,因此我不能使用
-索引2,4,5,6
。除此之外,我必须删除所有内容,直到每个文本行中的最后一个负数(不是行-索引2,这一行是每个组的名称),因此输出应该在两列中如下所示:

1-9/16 TCS DRILL
                    -2.685
                    -2.685
                    -3.935
1-11/32 TCS DRILL
                    -3.237
                    -3.237
                    -4.487
1-11/32 TCS DRILL
                    -5.699
1-1/8 TCS DRILL
                    -1.553
                    -2.338
                    -2.513
那么这个怎么样

(获取内容-原始$file)-拆分“+”|其中对象{$}| ForEach对象{
$entry=$\分割“`r`n”
($entry | Select-索引2)-替换“^\。\s+”
$entry | Select-跳过3 |其中对象{$|}ForEach对象{
-$(($)-split“-”号[-1].Trim())
}
}
我们所做的和以前一样。输出文件中的“工具”行。现在,我们处理每组剩余的每一行。对于不是空的行,我们只是根据减号将字符串拆分成一个数组。每行的最后一个元素
[-1]
应该是您正在查找的值,我们将
-
静态添加回字符串。使用
.Trim()
为我们清理间距

样本输出

1-9/16 TCS钻机
-2.685
-2.685
-3.935
1-11/32 TCS钻机
-3.237
-3.237
-4.487
1-11/32 TCS钻机
-5.699
1-1/8 TCS钻机
-1.553
-2.338
-2.513
这是快速和肮脏的,如果我们只是删除所有的空行开始,将更好地编码,但这确实工作。我到家后可能会把它整理一下。让我知道你的情况

第二轮

现在我有了更多的时间,我试着清理一下。结果仍应与上述相同

(获取内容-原始$file)-拆分“+”|其中对象{$}| ForEach对象{
$entry=$\.Split('r`n',[StringSplitOptions]::RemoveEmptyEntries)-替换“^\.\s+”
$entry[0]
($entry |选择对象-跳过1)-替换“*-”,“-”
}
这次使用
[StringSplitOptions]::removeMptyEntries
删除空条目,这样我就不必猜测哪一行包含项目字符串。另外,由于
-replace
在数组上工作,因此我们可以使用它,而无需使用更多的
ForEach
循环。至于最后两个正则表达式字符串:

  • “^\.\s+”
    匹配字符串开头的句点和其后的所有连续空格
  • “*-”
    匹配所有内容,直到最后一次出现
    -
  • 那么这个怎么样

    (获取内容-原始$file)-拆分“+”|其中对象{$}| ForEach对象{
    $entry=$\分割“`r`n”
    ($entry | Select-索引2)-替换“^\。\s+”
    $entry | Select-跳过3 |其中对象{$|}ForEach对象{
    -$(($)-split“-”号[-1].Trim())
    }
    }
    
    我们所做的和以前一样。输出文件中的“工具”行。现在,我们处理每组剩余的每一行。对于不是空的行,我们只是根据减号将字符串拆分成一个数组。每行的最后一个元素
    [-1]
    应该是您正在查找的值,我们将
    -
    静态添加回字符串。使用
    .Trim()
    为我们清理间距

    样本输出

    1-9/16 TCS钻机
    -2.685
    -2.685
    -3.935
    1-11/32 TCS钻机
    -3.237
    -3.237
    -4.487
    1-11/32 TCS钻机
    -5.699
    1-1/8 TCS钻机
    -1.553
    -2.338
    -2.513
    
    这是快速和肮脏的,如果我们只是删除所有的空行开始,将更好地编码,但这确实工作。我到家后可能会把它整理一下。让我知道你的情况

    第二轮

    现在我有了更多的时间,我试着清理一下。结果仍应与上述相同

    (获取内容-原始$file)-拆分“+”|其中对象{$}| ForEach对象{
    $entry=$\.Split('r`n',[StringSplitOptions]::RemoveEmptyEntries)-替换“^\.\s+”
    $entry[0]
    ($entry |选择对象-跳过1)-替换“*-”,“-”
    }
    
    这次使用
    [StringSplitOptions]::removeMptyEntries
    删除空条目,这样我就不必猜测哪一行包含项目字符串。另外,由于
    -replace
    在数组上工作,因此我们可以使用它,而无需使用更多的
    ForEach
    循环。至于最后两个正则表达式字符串:

    • “^\.\s+”
      匹配字符串开头的句点和其后的所有连续空格
    • “*-”
      匹配所有内容,直到最后一次出现
      -
    另一种选择:

    Get-Content $file -Delimiter ('_'*70) |
    foreach {
       $_.split("`n") -match '\.+' -replace '^\.\s+' -replace '.+\s(-[0-9.]+)',"$(' '*20)`$1"
      }
    
    使用示例数据输出:

    1-9/16 TCS DRILL
                        -2.685
                        -2.685
                        -3.935
    1-11/32 TCS DRILL
                        -3.237
                        -3.237
                        -4.487
    1-11/32 TCS DRILL
                        -5.699
    1-1/8 TCS DRILL
                        -1.553
                        -2.338
                        -2.513
    1-1/16 TCS DRILL
                        -8.074
    
    这利用了字符串-将每个钻孔规范集分离为一个单独的字符串。之后,只需删除您不需要的行和字符,插入空格即可获得您想要的格式。

    另一个选项:

    Get-Content $file -Delimiter ('_'*70) |
    foreach {
       $_.split("`n") -match '\.+' -replace '^\.\s+' -replace '.+\s(-[0-9.]+)',"$(' '*20)`$1"
      }
    
    使用示例数据输出:

    1-9/16 TCS DRILL
                        -2.685
                        -2.685
                        -3.935
    1-11/32 TCS DRILL
                        -3.237
                        -3.237
                        -4.487
    1-11/32 TCS DRILL
                        -5.699
    1-1/8 TCS DRILL
                        -1.553
                        -2.338
                        -2.513
    1-1/16 TCS DRILL
                        -8.074
    

    这利用了字符串-将每个钻孔规范集分离为一个单独的字符串。之后,只需删除您不需要的行和字符,插入空格即可获得您想要的格式。

    @Matt再次发布。“提前谢谢!”马特再次发帖。提前谢谢。谢谢@mjolinor,你的答案也很有效,但我还是投票给Matt作为最佳答案,因为它有更详细的解释,让我更容易理解。:)没问题。马特的也可以。它唯一的实质性优势是,它可以轻松地扩展到非常大的文件,因为您不是h