2015-03-30 20 views
0

該文件中包含的數據是這樣一個巨大的數額:分割多線串組和輸出選定字段

______________________________________________________________________ 

.   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

(Get-Content -Raw $file) -split "_+" | 
    Where-Object{$_} | 
ForEach-Object{($_ -split "`r`n" | Select -Index 2) -replace "^\.\s+"} 

不過,我也想依舊保持第一每條下劃線之後的文本行,並輸出每個拆分組中的文本行的其餘部分。但是文本行的數量是不確定在每個組中,所以我不能使用-index 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 
+0

@Matt再次發佈。提前致謝。 – 2015-03-30 20:54:49

回答

2

這樣呢?

(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()清理我們的間距。

樣本輸出

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

現在,我有一點時間我試圖清理這個了一下。結果應該還是一樣的這次使用[StringSplitOptions]::RemoveEmptyEntries刪除空項,所以我不用去猜測哪些行包含的項目串上述

(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 ".*-","-" 
} 

。此外,由於-replace適用於陣列,因此我們可以使用它而不需要更多的ForEach循環。至於最後兩個正則表達式的字符串:

  • "^\.\s+"一個字符串的起點和之後
  • ".*-"匹配的一切,直到-
+0

這對我來說很好,也更容易理解。很好的幫助,再次感謝。我會嘗試更多類似的數據來查看是否有任何錯誤出現。 – 2015-03-31 00:51:29

+0

@RootLoop如果您遇到問題,請嘗試我的Round2。應該是同樣的事情,只是一點點清潔。 – Matt 2015-03-31 00:54:22

+0

第二個也很棒。我需要對你的代碼進行同樣的研究,並且在你今天早些時候維護的兩個網站上花費一些時間:) – 2015-03-31 01:08:20

2

另一種選擇最後一次出現所有連續的空格一段匹配:使用您的樣本數據

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 

這利用了字符串 - 將每個鑽孔規格集分隔成一個單獨的字符串。之後,它只是刪除行和字符的問題,您不希望插入空格來獲取您想要的格式。

+0

感謝@mjolinor,你的作品也是如此,但我仍然選擇Matt作爲最佳答案,因爲它具有更詳細的解釋,我更容易理解。 :) – 2015-03-31 00:49:41

+0

沒問題。馬特的工作也會很好。關於其唯一的實質性優勢是它可以輕鬆擴展到非常大的文件,因爲您不必將整個文件讀入內存。它正在處理一個鑽井規範記錄。 – mjolinor 2015-03-31 01:53:33