Powershell将后缀与姓氏分开

时间:2014-02-04 21:53:54

标签: powershell-v3.0

我将在文本文件中有一个名单列表: 例如: 史密斯三世 约翰逊JR。 利

我需要将后缀与姓氏分开。如果名称包含空格,则将确定后缀,如果该空间的右侧有少于4个字符的文本,则将被视为正常名称的一部分。然后,我需要将数据输出到包含三列的csv文件中;原始,姓氏,后缀。

有什么建议吗?

$InputLocation = "C:\test\suffix test\"
$OutputLocation = "C:\test\suffix test\"

$file = gci -Path $InputLocation

$lines = Get-Content($file.FullName)|

Foreach-object{

    $pattern = "(.*)( )(.*)"
    Write-Host $Matches[3]
    if($_ -match $pattern -and $Matches[3] -lt 4){

        $a = $Matches[0]
        $b = $Matches[1]
        $c = $Matches[3]


        $output = $a + "," + $b + "," + $c
        $output

    }else{ 


       $e = $_
       $outputElse = $e + "," + $e
       $outputElse

    }

    }| Set-Content($OutputLocation + "Output.csv")

这就是我所处的位置。这将几乎完美地工作,除了在一个不将JR作为后缀

的情况下
Input file is a text file that looks similar to 
Johnson
Smith Jr
Manca III
Clarke
Champagne
Manship (T)


Expected Output would be
Johnson|Johnson|<null>
Smith Jr.|Smith|Jr 
Manca III|Manca|III
Clarke|Clarke|<null>
Champagne|Champagne|<null>
Manship (T)|Manship|(T)

1 个答案:

答案 0 :(得分:0)

以下函数将执行您正在寻找的解析。它成功完成了你提供的测试串。

function Split-NameString
{
    PARAM (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string]$Name
    )
    PROCESS 
    {
        $trimmedName = $Name.Trim()
        $trimmedName -match "^(?<surname>.*?)(?:| (?<suffix>[^ ]{1,3}))$" | Out-Null
        Write-Output (New-Object -TypeName PSCustomObject -Property @{
            FullName = $trimmedName;
            Surname = $Matches["surname"];
            Suffix = $Matches["suffix"];
        })
    }
}

您可以做什么,从文件中读取字符串并将输出写入csv文件,如下所示:

$names = Get-Content "c:\input.txt"
$names | Split-NameString | Select FullName, Surname, Suffix | Export-Csv -NoTypeInformation -Path "C:\output.csv"

Select FullName, Surname, Suffix部分是按照您在csv文件中的顺序获取列。