แยกค่าคอลัมน์ในไฟล์ CSV โดยใช้ตัวคั่นหลายตัวและซ้ำกัน

ฉันมีไฟล์ CSV ที่ไม่เป็นระเบียบ ฉันกำลังพยายามใช้ regex เพื่อแยกชื่อและนามสกุลออกจากค่าในคอลัมน์ในไฟล์ csv ชื่อและนามสกุลจะมีคอลัมน์ของตัวเอง

ไฟล์ CSV (ที่มีตัวคั่นผสมกัน):

ID,Description,Number
JDo,John Doe - Temp - Client Client Ops,SomeValue
JDo,John  Doe - Temp - Client Client Ops,SomeValue
JDo,John  Doe  - Temp - Client Client Ops,SomeValue
JDo,John  Doe  -  Temp - Client Client Ops,SomeValue
JDo,John  Doe  -  Temp  - Client Client Ops,SomeValue
JDo,John  Doe  -  Temp  -  Client Client Ops,SomeValue
JDo,John  Doe  -  Temp  -  Client  Client Ops,SomeValue
JDo,John  Doe  -  Temp  -  Client  Client  Ops,SomeValue
JDo,John  Doe  -  Temp  -  Client  Client  Ops ,SomeValue
JDo,John  Doe  -  Temp  -  Client  Client  Ops  ,SomeValue
JDo,John Doe-Temp-Client Client Ops,SomeValue
JDo,John  Doe - Temp-Client Client Ops,SomeValue
JDo,John  Doe  - Temp-Client Client Ops,SomeValue
JDo,John  Doe-Temp -  Client Client Ops,SomeValue
JDo,John  Doe  -  Temp  - Client Client Ops,SomeValue
JDo,John  Doe  -  Temp  -  Client Client Ops,SomeValue
JDo,John  Doe  -  Temp  -  Client  Client Ops,SomeValue
JDo,John  Doe  -  Temp  -  Client  Client  Ops,SomeValue
JDo,John  Doe-Temp  -  Client  Client  Ops ,SomeValue
JDo,John  Doe-Temp-Client  Client  Ops  ,SomeValue
JDo,John.Doe - Temp - Client Client Ops,SomeValue
JDo,John .Doe - Temp - Client Client Ops,SomeValue
JDo,John. Doe - Temp - Client Client Ops,SomeValue
JDo,John . Doe - Temp - Client Client Ops,SomeValue
JDo,John.Doe - Temp - Client Client Ops  ,SomeValue
JDo,John .Doe - Temp - Client Client Ops  ,SomeValue
JDo,John. Doe - Temp - Client Client Ops  ,SomeValue
JDo,John . Doe - Temp - Client Client Ops  ,SomeValue
JDo,John.Doe-Temp-Client Client Ops,SomeValue
JDo,John .Doe-Temp-Client Client Ops,SomeValue
JDo,John. Doe-Temp-Client Client Ops,SomeValue
JDo,John . Doe-Temp-Client Client Ops,SomeValue
JDo,John.Doe  - Temp  - Client Client Ops,SomeValue
JDo,John .Doe -  Temp -  Client Client Ops,SomeValue
JDo,John. Doe  -  Temp  -  Client Client Ops,SomeValue
JDo,John . Doe - Temp - Client Client Ops,SomeValue
JDo,John?Doe - Temp - Client Client Ops,SomeValue
JDo,John ?Doe - Temp - Client Client Ops,SomeValue
JDo,John? Doe - Temp - Client Client Ops,SomeValue
JDo,John ? Doe - Temp - Client Client Ops,SomeValue
JDo,John?Doe - Temp - Client Client Ops  ,SomeValue
JDo,John ?Doe - Temp - Client Client Ops  ,SomeValue
JDo,John? Doe - Temp - Client Client Ops  ,SomeValue
JDo,John ? Doe - Temp - Client Client Ops  ,SomeValue
JDo,John?Doe-Temp-Client Client Ops,SomeValue
JDo,John ?Doe-Temp-Client Client Ops,SomeValue
JDo,John? Doe-Temp-Client Client Ops,SomeValue
JDo,John ? Doe-Temp-Client Client Ops,SomeValue
JDo,John?Doe  - Temp  - Client Client Ops,SomeValue
JDo,John ?Doe -  Temp -  Client Client Ops,SomeValue
JDo,John? Doe  -  Temp  -  Client Client Ops,SomeValue
JDo,John ? Doe - Temp - Client Client Ops,SomeValue
JDo,"John,Doe - Temp - Client Client Ops",SomeValue
JDo,"John ,Doe - Temp - Client Client Ops",SomeValue
JDo,"John, Doe - Temp - Client Client Ops",SomeValue
JDo,"John , Doe - Temp - Client Client Ops",SomeValue
JDo,"  John,Doe - Temp - Client Client Ops  ",SomeValue
JDo,"  John ,Doe - Temp - Client Client Ops  ",SomeValue
JDo,"  John, Doe - Temp - Client Client Ops  ",SomeValue
JDo,"  John , Doe - Temp - Client Client Ops  ",SomeValue
JDo,"John,Doe-Temp-Client Client Ops",SomeValue
JDo,"John ,Doe-Temp-Client Client Ops",SomeValue
JDo,"John, Doe-Temp-Client Client Ops",SomeValue
JDo,"John , Doe-Temp-Client Client Ops",SomeValue
JDo,"John,Doe  - Temp  - Client Client Ops",SomeValue
JDo,"John ,Doe -  Temp -  Client Client Ops",SomeValue
JDo,"John, Doe  -  Temp  -  Client Client Ops",SomeValue
JDo,"John , Doe - Temp - Client Client Ops",SomeValue
JDo,John-Doe - Temp - Client Client Ops,SomeValue
JDo,John -Doe - Temp - Client Client Ops,SomeValue
JDo,John- Doe - Temp - Client Client Ops,SomeValue
JDo,John - Doe - Temp - Client Client Ops,SomeValue
JDo,John-Doe - Temp - Client Client Ops  ,SomeValue
JDo,John -Doe - Temp - Client Client Ops  ,SomeValue
JDo,John- Doe - Temp - Client Client Ops  ,SomeValue
JDo,John - Doe - Temp - Client Client Ops  ,SomeValue
JDo,John-Doe-Temp-Client Client Ops,SomeValue
JDo,John -Doe-Temp-Client Client Ops,SomeValue
JDo,John- Doe-Temp-Client Client Ops,SomeValue
JDo,John - Doe-Temp-Client Client Ops,SomeValue
JDo,John-Doe  - Temp  - Client Client Ops,SomeValue
JDo,John -Doe -  Temp -  Client Client Ops,SomeValue
JDo,John- Doe  -  Temp  -  Client Client Ops,SomeValue
JDo,John - Doe - Temp - Client Client Ops,SomeValue

หากต้องการเพิ่มคอลัมน์ชื่อและนามสกุล ฉันใช้โค้ดต่อไปนี้:

Function FixRxClaimReportAddFirstLastNameColumn {
  Param ($csvFile)

  Write-Host "Adding columns 'First Name' and 'Last Name' to $csvFile"
  Import-Csv $csvFile |
    Select-Object *, @{n='First Name'; e={if ($_.Description) {
        $columnFirstNameValue = $($_.Description -replace '\s+', ' ').split(" ")[0]
        if ($columnFirstNameValue -notlike "*,*" -and $columnFirstNameValue -notmatch '\?' -and $columnFirstNameValue -notlike "*.*" -and $columnFirstNameValue -notlike "*-*") {
          $columnFirstNameValue.Trim()
        } else {
          $columnFirstNameValue2 = $($_.Description -replace '\s+', ' ') -split {$_ -eq "-" -or $_ -eq "- " -or $_ -eq " -" -or $_ -eq " - " -or $_ -eq "," -or $_ -eq ", " -or $_ -eq " ," -or $_ -eq " , " -or $_ -eq "." -or $_ -eq ". " -or $_ -eq " ." -or $_ -eq " . " -or $_ -eq "?" -or $_ -eq "? " -or $_ -eq " ?" -or $_ -eq " ? "}
          $columnFirstNameValue2[0].Trim()
        }
      }}}, @{n='Last Name'; e={if ($_.Description) {
        $columnLastNameValue = $($_.Description -replace '\s+', ' ').split(" ")[1]
        if ($columnLastNameValue -notlike "*,*" -and $columnLastNameValue -notmatch '\?' -and $columnLastNameValue -notlike "*.*" -and $columnLastNameValue -notlike "*-*") {
          $columnLastNameValue.Trim()
        } else {
          $columnLastNameValue2 = $($_.Description -replace '\s+', ' ') -split {$_ -eq "-" -or $_ -eq "- " -or $_ -eq " -" -or $_ -eq " - " -or $_ -eq "," -or $_ -eq ", " -or $_ -eq " ," -or $_ -eq " , " -or $_ -eq "." -or $_ -eq ". " -or $_ -eq " ." -or $_ -eq " . " -or $_ -eq "?" -or $_ -eq "? " -or $_ -eq " ?" -or $_ -eq " ? "}
          $columnLastNameValue2[1].Trim()
        }
      }}} | Export-Csv "$csvFile-Results.csv" -NoTypeInformation -Force
  Write-Host "Complete."
  Write-Host ""
}

FixRxClaimReportAddFirstLastNameColumn 'C:\Scripts\Tests\Test1.csv'

เมื่อฉันรันโค้ดนี้ ค่าชื่อทั้งหมดควรเป็น John และค่านามสกุลทั้งหมดควรเป็น Doe อย่างไรก็ตาม ค่านิยมนั้นแตกต่างกันมากสำหรับทุกคน


person Fiddle Freak    schedule 21.01.2016    source แหล่งที่มา


คำตอบ (1)


คุณกำลังคิดซับซ้อนเกินไป ลบข้อมูลเพิ่มเติมออกจากส่วนท้ายของฟิลด์ Description เพื่อให้ได้เพียงชื่อ จากนั้นตัดแต่งชื่อและแบ่งออกเป็นชื่อและนามสกุลก่อนที่จะเพิ่มสิ่งเหล่านี้เป็นคุณสมบัติใหม่ให้กับออบเจ็กต์อินพุต

ลองสิ่งนี้:

Import-Csv 'C:\path\to\input.csv' | ForEach-Object {
  $rawname = $_.Description -replace '-[^-]*-[^-]*$'
  $firstname, $lastname = $rawname.Trim() -split ' *[ \?\.,-] *'
  $_ | Add-Member -Type NoteProperty -Name FirstName -Value $firstname
  $_ | Add-Member -Type NoteProperty -Name LastName -Value $lastname
  $_
} | Export-Csv 'C:\path\to\output.csv' -NoType
person Ansgar Wiechers    schedule 21.01.2016
comment
ขอบคุณอันการ์. คุณคือความช่วยเหลือที่ยิ่งใหญ่เสมอ :) - person Fiddle Freak; 21.01.2016
comment
คุณอาจจะหนีไปได้หากไม่มี $rawname เลย: $FirstName,$LastName,$null = $_ -split '[\s\?.,-]' | ? { $_ } - person xXhRQ8sD2L7Z; 22.01.2016
comment
@ ST8Z6FR57ABE6A8RE9UF อ่านและเข้าใจง่ายกว่าถ้าคุณไม่ทำในบรรทัดเดียว นอกจากนี้ การแยกด้วยวิธีดังกล่าวยังมีข้อเสียคือคุณไม่สามารถจัดการชื่อหรือชื่อที่มียัติภังค์หลายชื่อได้ - person Ansgar Wiechers; 22.01.2016