2013-08-25 49 views
0

PowerShell相當新穎,想知道是否有人可以提供以下內容。基本上,我有一些通過特殊字符($)分開記錄一個.txt文檔(例如)Powershell - 將多行文本分割成單獨的記錄

ID
輸入的日期
名稱
標題
地址
電話
$
ID
輸入的日期
名稱
標題
地址
電話
$

我想在$之間的每一個項目拆分成單獨的「記錄」,這樣我可以通過每個記錄循環。因此,例如,我可以檢查上面的每條記錄,並返回沒有輸入電話號碼的所有記錄的記錄ID。

在此先感謝

回答

1

如果每個記錄包含的屬性,你可以採取這種方法的一個固定的數字。它通過創建自定義對象循環,同時跳過美元符號線。

$d = Get-Content -Path C:\path\to\text\file.txt 
for ($i = 0; $i -lt $d.Length; $i+=7) { 
    New-Object -TypeName PsObject -Property @{ 
     'ID'   = $d[$i] 
     'Date Entered' = $d[$i+1] 
     'Name'   = $d[$i+2] 
     'Title'  = $d[$i+3] 
     'Address'  = $d[$i+4] 
     'Phone'  = $d[$i+5] 
    } 
} 
+1

不幸的是,沒有固定數量的屬性。如果一個字段沒有條目,則字段從.txt文件中一起丟失。通過將$符號中的每個部分拆分爲它自己的文本文件,我設法得到了我想要的結果。然後,我可以遍歷每個文本文件,並使用模式匹配的select-string cmdlet來提取我需要的位。 有沒有辦法將$符號中的信息拆分成單獨的PsObjects?這至少可以讓我不必輸出一堆.txt文件,然後清理它們。 – user2714683

+0

@ user2714683好的,你怎麼知道第3行是名字?你是否在這個例子中發佈了你正在使用的所有東西?如果每行都有名稱和值,那麼我可以向您展示另一種方法,但您的示例似乎意味着僅提供了該值。 –

+0

是每行都有一個值,但是如果沒有輸入該值,則整行不存在。例如,在我上面的例子中,如果第一條記錄中沒有輸入'Date Entered'的值,那麼整條線不會存在,'Name'值將在第2行。我正在處理凌亂的數據庫輸出,所以我試圖保持我的例子簡單。基本上我只是想將$符號之間的每個部分視爲單獨的記錄。所以我可以讓腳本分別分析每個腳本。 – user2714683

1

我曾經有過同樣的要求......這是我做的

$loglocation = "C:\test\dump.txt" 
$reportlocation = "C:\test\dump.csv" 
$linedelimiter = ":" 
$blockdelimiter = "FileSize" 

$file = Get-Content $loglocation 

$report = @() 
$block = @{} 

foreach ($line in $file) 
{ 

    if($line.contains($linedelimiter)) 
     { 
     $key = $line.substring(0,$line.indexof($linedelimiter)).trimend() 
     $value = $line.substring($line.indexof($linedelimiter)+1).trimstart() 

     $block.Add($key,$value) 

     if ($block.keys -contains $blockdelimiter) 
      { 
      $obj = new-object psobject -property $block 
      $report += $obj 
      $block = @{} 
      } 
     } 
} 

$report 
$report | Export-Csv $reportlocation -NoTypeInformation 

所以通過每一行你循環,定義鍵和值和對象添加到哈希表。一旦鍵包含blockdelimiter,一個新的對象被寫入一個數組並且哈希表被清除。

在我的情況下,linedelimiter是一個冒號,blockdelimiter是一個有效的記錄,所以你將不得不做一些改變。讓我知道這種方法是否適合您的需求,而且您無法找到該做什麼。

P.S.默認情況下,只會顯示數組中第一個對象的noteproperties,因此您必須將數組傳遞給Select-Object並添加所需的所有屬性。

Grts。