首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拆分多行字符串组并输出所选字段

拆分多行字符串组并输出所选字段
EN

Stack Overflow用户
提问于 2015-03-30 20:53:59
回答 2查看 2.5K关注 0票数 0

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

代码语言:javascript
复制
______________________________________________________________________

.         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

I can output the first text line after each underscore

代码语言:javascript
复制
(Get-Content -Raw $file) -split "_+" | 
    Where-Object{$_} | 
ForEach-Object{($_ -split "`r`n" | Select -Index 2) -replace "^\.\s+"}

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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-30 21:42:46

那这个怎么样?

代码语言:javascript
复制
(Get-Content -Raw $file) -split "_+" | Where-Object{$_} | ForEach-Object{    
    $entry = $_ -split "`r`n" 

    ($entry | Select -Index 2) -replace "^\.\s+"
    $entry | Select -Skip 3 | Where-Object{$_} | ForEach-Object{
        "-$(($_ -split "-")[-1].Trim())"
    }
}

我们所做的一切和以前一样。输出文件中的“工具”行。现在我们处理每个组的每一行。对于同样不是空的行,我们只是根据减号将字符串拆分成一个数组。每一行的最后一个元素[-1]应该是您要查找的值,我们静态地将-添加回字符串。使用.Trim()为我们清理间距。

样本输出

代码语言:javascript
复制
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

这是快速和肮脏,如果我们只是删除所有的空行开始,但这是更好的编码,但这是可行的。当我回家的时候,我可能会把它整理一下。告诉我这对你有什么好处。

第2轮

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

代码语言:javascript
复制
(Get-Content -Raw $file) -split "_+" | Where-Object{$_} | ForEach-Object{
    $entry = $_.Split("`r`n",[StringSplitOptions]::RemoveEmptyEntries) -replace "^\.\s+"
    $entry[0]
    ($entry | Select-Object -Skip 1) -replace ".*-","-"
}

这次使用[StringSplitOptions]::RemoveEmptyEntries删除空条目,这样我就不必猜测哪一行包含项字符串。而且,由于-replace在数组上工作,所以我们可以使用它而不需要更多的ForEach循环。至于最后两个正则字符串:

  • "^\.\s+"匹配字符串开头的句点和后面所有的连续空格
  • ".*-"匹配所有东西,直到最后一次出现-
票数 2
EN

Stack Overflow用户

发布于 2015-03-30 22:01:20

另一种选择:

代码语言:javascript
复制
Get-Content $file -Delimiter ('_'*70) |
foreach {
   $_.split("`n") -match '\.+' -replace '^\.\s+' -replace '.+\s(-[0-9.]+)',"$(' '*20)`$1"
  }

使用示例数据输出:

代码语言:javascript
复制
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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29356077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档