Разделение значений столбца в CSV в powershell - PullRequest
0 голосов
/ 31 октября 2019

У меня есть несколько файлов, содержащих полные имена людей в одной ячейке. Я хотел бы разделить эти имена на два столбца - имя и фамилию

- код, который я использовал для разделения значений, работавших на предыдущей итерации сценария, который у меня был, но теперь больше не работает

Я не могу точно определить, где лежит ошибка, кто-нибудь может посоветовать?

$path          = 'C:\MAY2019correct'

#XYZ

$excelOut      = Join-Path -Path $path -ChildPath 'XYZ.csv'
$completedFile = Join-Path -Path $path -ChildPath 'Completed-XYZ.csv'
$defaultValue  = 'ABC'
$filter        = '*XYZ*'
$excelFile     = Get-ChildItem -Path $path -Filter $filter -File | 
Select-Object -First 1
$allstaff = @()

if ($excelFile) {
$excel = New-Object -ComObject Excel.Application -Property @{Visible = 
$false} 
# Open the file
$workbook = $excel.Workbooks.Open($excelFile.FullName) 
# Activate the first worksheet
$sheet = $workbook.Sheets.Item(1) 
[void]$sheet.Cells.Item(1, 1).EntireRow.Delete() # Delete the first row
[void]$sheet.Cells.Item(1, 1).EntireRow.Delete() # Delete the 2 row
[void]$sheet.Cells.Item(1, 1).EntireRow.Delete() # Delete the 3 row

$workbook.SaveAs($excelOut,6)
# Close workbook and save changes
$workbook.Close($true) 
# Quit Excel
$excel.Quit()

# clean-up Com objects
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($sheet) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null

$headers = 'Element Name','Surname','EmployeeNo','Amount','YTD'
# import the csv file and select all the above headers plus one that is created using a calculated property
$csv = Import-Csv -Path $excelOut -Header $headers -UseCulture | Select-Object *, @{Name = 'Paycentre'; Expression = {$defaultValue}}|


Write-Host "Creating completed csv file '$completedFile'"
$csv | Export-Csv -Path $completedFile -UseCulture -Force - 
NoTypeInformation
}
else {
Write-Warning "Could not find a file using filter '$filter' in path 
'$path'"
}

foreach($staff in $completedFile)
{

   #Get the values from the CSV for this row
   $Surname = $staff.Surname
   $Surname = $Surname.Substring(0, $Surname.lastIndexOf(' '))
   $Initial = $staff.Surname
   $Initial = $Initial.Substring($Initial.lastIndexOf(' ') + 1 )
   $Firstname = $staff.Surname
   $Firstname = $Firstname.Substring($Initial.lastIndexOf(' ') + 1 )
   $EmployeeNo = $staff.EmployeeNo
   $NINumber = $staff.NINumber
   $Amount = $staff.Amount
   $Paycentre = $staff.Paycentre

   $staff2  = New-Object System.Object
   $staff2 | Add-Member -MemberType NoteProperty -Name "Surname" -Value $Surname
   $staff2 | Add-Member -MemberType NoteProperty -Name "FirstName" -Value $Firstname
   $staff2 | Add-Member -MemberType NoteProperty -Name "EmployeeNo" -Value $EmployeeNo
   $staff2 | Add-Member -MemberType NoteProperty -Name "NINumber" -Value $NINumber
   $staff2 | Add-Member -MemberType NoteProperty -Name "Amount" -Value $Amount
   $staff2 | Add-Member -MemberType NoteProperty -Name "FirstName" -Value $Initial
   $staff2 | Add-Member -MemberType NoteProperty -Name "Paycentre" -Value $Paycentre
   #add to array
    $allstaff += $staff2
 } 

 $allstaff | Export-Csv -NoTypeInformation -Path $completedFile

1 Ответ

0 голосов
/ 31 октября 2019

Первое, что я вижу, это то, что ваш цикл foreach перебирает переменную $completedFile, которая выглядит как путь к файлу, а не как коллекция.

Должно ли это быть foreach ($staff in $csv) вместо этого?

Кроме того, очень осторожно относитесь к именам в коде. Очень легко делать плохие предположения, которые ломают вещи. См. Программисты Falsehoods верят в имена для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...