简体   繁体   中英

Powershell modify CSV

I read a lot of questions here about this and i don't find what i search ...

I start scripting with powershell (just for information :p )

I want to modify a CSV file, exported from a database with information like "FirstName,LastName,OtherMail,IDAurion,Department". I have to add some titles to the HEADER, and i have to take informations in the CSV to concatenate some informations and put them in another CSV file.

I don't know if i explain well, i put you my script :


    $OriginalCSV = "$PSScriptRoot\original.csv"

function Remove-StringLatinCharacters
{
    PARAM ([string]$String)
    [Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding("Cyrillic").GetBytes($String))
}

Import-Csv -path $OriginalCSV -Encoding Default | ForEach-Object { 

    $OtherMail = $_.OtherMail
    $IDAurion = $_.IDAurion
    $Department = $_.Department

    $FirstnameCSV = $_.FirstName
    $FirstName = $FirstnameCSV -replace '(^\s+|\s+$)',''
    $FirstnameNoLatin = Remove-StringLatinCharacters $FirstName
    $FirstnameNoLatinNoSpace = $FirstnameNoLatin -replace '\s','-'
    $FirstnameFirstLetterUpper = $Firstname.Substring(0,1).ToUpper()

    $LastNameCSV = $_.LastName
    $LastName = $LastnameCSV -replace '(^\s+|\s+$)',''
    $LastnameNoLatin = Remove-StringLatinCharacters $LastName
    $LastnameNoLatinNoSpace = $LastnameNoLatin -replace '\s',''
    $LastnameFirstLetterUpper = $Lastname.Substring(0,1).ToUpper()

    $UserPrincipalNameCSV = $FirstnameCSV + "." + $LastNameCSV + "@campus.ocellia.fr"
    $UserPrincipalNameConcatene = $FirstnameNoLatinNoSpace + "." + $LastNameNoLatinNoSpace + "@email.fr"
    $UserPrincipalName = $UserPrincipalNameConcatene.ToLower()

    $MailNickName = $FirstnameNoLatinNoSpace.substring(0,1).toupper() + $($FirstnameNoLatin.substring(1).tolower() -replace '\s','') + $LastnameNoLatinNoSpace.toupper()

    $Password = $FirstnameFirstLetterUpper + $LastnameFirstLetterUpper + $IDAurion + "$"
    
    $Number = 0

    Get-Content $OriginalCSV |
    ForEach-Object{ 

        If($Number -eq 0){
            $_ + ",MailNickName" + ",Password" + ",UserPrincipalName"
            $Number = 1
        } 
        Else {
            $_ + "," + $MailNickName + "," + $Password + "," + $UserPrincipalName
        }
    } | Out-File $PSScriptRoot\Modified-CSV.csv

}

This work for 1 line, but not for multiples line ...

Edit :

This is the examples for input CSV and how i want the resulting output CSV:

Input csv :

Firstname,Lastname,OtherMail,ID,Department
Pierre,DUPONT,pierre.dupont@mail.com,123456,Paris
Marie,CHANTAL,marie.chantal@mail.com,456789,Marseille

Output csv:
Firstname,Lastname,OtherMail,ID,Department,MailNickName,Password,UserPrincipalName
Pierre,DUPONT,pierre.dupont@mail.com,123456,Paris,PierreDupont,PD123456,p.dupont@entreprise.com
Marie,CHANTAL,marie.chantal@mail.com,456789,Marseille,MarieCHANTAL,MC456789,m.chantal@entreprise.com

I'm guessing this is what you're trying to do but since we don't have a minimal reproducible example it's quite hard to tell. I also attempted to improve your code, there was a lot of redundancy.

$OriginalCSV = "$PSScriptRoot\original.csv"
$ModifiedCSV = "$PSScriptRoot\modified.csv"
$txtInfo = (Get-Culture).TextInfo

function Remove-StringLatinCharacters
{
    PARAM ([string]$String)
    [Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding("Cyrillic").GetBytes($String))
}

(Import-Csv -Path $OriginalCSV -Encoding Default | ForEach-Object { 

    $OtherMail = $_.OtherMail.Trim()
    $IDAurion = $_.IDAurion.Trim()
    $Department = $_.Department.Trim()
    $FirstnameCSV = $_.FirstName.Trim()
    $LastNameCSV = $_.LastName.Trim()

    $firstName = (Remove-StringLatinCharacters $FirstName) -replace '\s','-'
    $lastName = (Remove-StringLatinCharacters $LastName) -replace '\s'
    
    $UserPrincipalName = "$FirstnameCSV.$LastNameCSV@campus.ocellia.fr"
    $UserPrincipalNameConcat = "$firstName.$lastName@email.fr".ToLower()

    $MailNickName = $txtInfo.ToTitleCase($firstName) + $lastName.ToUpper()
    $Password = "{0}{1}$IDAurion$" -f $firstName.ToUpper()[0],$lastName.ToUpper()[0]

    [pscustomobject]@{
        FirstNameCSV = $FirstnameCSV
        LastNameCSV = $LastNameCSV
        OtherMail = $OtherMail
        IDAurion = $IDAurion
        Department = $Department
        MailNickName = $MailNickName
        Password = $Password
        UserPrincipalNameCAMPUS = $UserPrincipalName
        UserPrincipalNameEMAILFR = $UserPrincipalNameConcat
    }

} | ConvertTo-Csv -NoTypeInformation) -replace '"' |
Out-File $ModifiedCSV

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM