Powershell - 将多行文本拆分为单个记录

时间:2013-08-25 02:36:02

标签: powershell

PowerShell相当新,并想知道是否有人可以提供以下内容。基本上我有一个.txt文档,其中包含一些由特殊字符($)(例如)

分隔的记录

ID
输入日期
姓名
标题
地址
电话
$
ID
输入日期
姓名
标题
地址
电话
$

我想将$中的每个项目分成单个“记录”,以便我可以循环遍历每个记录。例如,我可以检查上面的每条记录,并返回所有没有输入电话号码的记录的记录ID。

提前致谢

2 个答案:

答案 0 :(得分: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 :(得分: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。