2013-08-25 33 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。