将 csv 的一列分成两部分,如果只有一个名称,则会失败

问题描述 投票:0回答:1

我需要导出多人的联系人,并以特定方式将制表符分隔文件修改为csv。导出的文件只有两列,名称和电子邮件,但我需要它是电子邮件、名称、名字、姓氏。我的脚本虽然可能很粗糙,并且我将其设置为作为 sendto 运行,但确实有效。如果有人没有列出第二个名字,我就会遇到问题。我可以在 split 周围添加 if 语句吗?当我尝试时它总是破裂

这是迄今为止我的代码。

  "Received $($args.Count) files:"
foreach( $path in $args ) {
"Processing file: $path"   
$filename = [System.IO.Path]::GetFileName($path)
}
Import-CSV -Path $path  -Delimiter "," -Header Email, Name, FirstName, LastName | select -skip 4 |
ForEach-Object{
$first, $last = $_.Email -split " "
$_.FirstName = "$first"
$_.LastName = "$last"
$email = $_.Name
$_.Name = "$first $last"
$_.Email = $email
$_
} |
 Export-CSV C:\Users\jjasper\Desktop\Composer\ContactExport\result\$filename -Delimiter "," -NoTypeInformation
(Get-Content -Path C:\import\$filename ).Replace('"','') | Set-Content -Path C:\import\$filename
(Get-Content -Path C:\import\$filename ) | ? {$_.trim() -ne "" } | set-content C:\import\$filename
powershell csv export-to-csv
1个回答
0
投票

如果没有 csv 内容的一些示例,很难为您提供帮助。但是,我认为您应该尝试使用对象来按照您想要的方式操作数据,例如,如果您的 CSV 有 4 个标头,那么您可以使用它来执行此操作。

$csvImport = Import-CSV -Path $path -Header Email, Name, FirstName, LastName

$reOrderExport=@()

foreach($row in $csvImport){

    $obj=[PSCustomObject]@{
        Name = $row.FirstName + $row.LastName
        email = $row.Email
        userName = ($row.Email -split '@')[0]
        familiyName = if($row.LastName -like ''){
            'noLastName'
        }else{
            $row.LastName
        }
    }

    $reOrderExport+=$obj
    
}

$reOrderExport | Export-CSV -Path $exportPath -NoTypeInformation

您只需获取所有 CSV 内容并处理导入的数据以生成所需的数组,然后导出该数组,或者如果您查看 csv 列表,则继续将其添加到文件中。

© www.soinside.com 2019 - 2024. All rights reserved.