Powershell - 正则表达式 - 固定宽度文件 - 转义字符

时间:2016-08-04 17:50:49

标签: regex powershell

在读取这样的固定宽度文件时:

ABC       7112123207/24/16Smith                              Timpson                            Head Coach                                                            412-222-0000        00011848660    ELl CAAN HIGH SCHOOL                  325 N Peal AVE.                   Smith                         Timpson                       Head Coach                              COLORADO CITY            AZ 86021       01             FALL      MALE      07/29/16EQ15031                  1977904        BUDDY'S ALL STARS INC.                  BUDDY ALL STARS                                                                                                                             N                 V12V70R16                                1.00V12V70R16  

我希望逃避单个空格和/或撇号。

我在Powershell中尝试了我的正则表达式:

 $Line | Select-String -Pattern "^(.*)[a-zA-Z0-9?\s?]" -AllMatches    

我需要将匹配值读作:

ABC
12345607/24 / 16Joe(这分为三:123456,07 / 24/16,乔)
史密斯
主教练
好友的盒子

我尝试将切片添加到csv,将每个切片分配给标头。例如:

$csh.USER_GROUP = $line.Substring(0,10).Trim() 
$csh.ORDER_NUMBER = $line.Substring(10,8).Trim()        
$csh.ORDER_ENTRY_DATE=$line.Substring(18,8).Trim()
$csh.CONTACT_FIRST=$line.Substring(26,35).Trim()
$csh.CONTACT_LAST=$line.Substring(61,35).Trim()
$csh.CONTACT_TITLE=$line.Substring(96,35).Trim()
$csh.CONTACT_EMAIL= $line.Substring(131,35).Trim()
$csh.CONTACT_PHONE=$line.Substring(166,20).Trim()
$csh.SCHOOL_ID=$line.Substring(186,15).Trim() 
} | convertto-csv | select-object -skip 1 | out-file temp.csv 

现在,假设存在空格和重复元素,则错误的是不允许重复键。有优雅的选择吗?

1 个答案:

答案 0 :(得分:1)

使用两个或多个空格作为分隔符进行匹配:

if ($Line -match '(\S.*?)  +(.{6})(.{8})(.*?)  +(.*?)  +(.*?)  +(.*)') {
    $whatsit = $matches[1]
    $index = $matches[2] 
    $date = $matches[3]
    $name1 = $matches[4]
    $name2 = $matches[5]
    $position = $matches[6]
    $place = $matches[7]
} else {
    echo "Bad line $Line"
}