Résolu Manipulation de fichiers et transcodage

Plus d'informations
il y a 3 mois 1 semaine - il y a 3 mois 6 jours #33641 par Dead
Bonjour, 

Je vous explique mon atelier. 
Je dois créer trois scripts, mais pour l'instant j'en ai fait qu'un pour essayer de mettre les grandes lignes. 
J'ai deux ERP différents. Je dois récupérer les infos qui sont dans un fichier xml sur un serveur, transcoder les infos, et transférer le résultat sur l'autre serveur, sur l'autre ERP.

J'ai commencé un semblant de script. Mais j'ignore si je vais dans la bonne direction. 
Le besoin général:
  • Transcoder le code du programme
  • Transcoder le code du bien
  • Envoyer le fichier en FTP
Etape 1: pour transcoder le code du bien, le format de sortie du premier ERP est ainsi fait: <programme->0025</programme>. Il faut que le format attendu soit  <programme->XX0025</programme>

Etape 2: pour transcoder le code du bien, le format de sortie est  bien-code>01.XX.0003</bien-code> ou XX sera généralement 00 mais pas obligatoirement. Format attendu : bien-code>010003</bien-code>

Etape 3: les fichiers doivent être envoyés sur un serveur FTP.


Voici mon script:
# Charger le contenu du fichier XML
[xml]$xmlContent = Get-Content -Path "C:\Chemin\vers\votre\fichier.xml"

# Extraire les valeurs nécessaires du fichier XML
$codeDpt = $xmlContent.SelectSingleNode("//bien-dpt").InnerText
$codeProgramme = $xmlContent.SelectSingleNode("//bien-programme").InnerText
$codeBien = $xmlContent.SelectSingleNode("//bien-code").InnerText

# Étape 1
$codeProgrammeTranscode = TranscoderCodeProgramme -codeDpt $codeDpt -codeProgramme $codeProgramme

# Étape 2
$codeBienTranscode = TranscoderCodeBien -codeBien $codeBien

# Étape 3
EnvoyerEnFTP -cheminLocal "C:\Chemin\vers\votre\fichier.xml" -hoteFTP "serveur.com" -loginFTP "login-$codeDpt-B09" -motDePasseFTP "VotreMotDePasse" -repertoireFTP "/"

#######################################################################################################################################################################################


# Étape 1 : Transcoder le code du programme
function TranscoderCodeProgramme {
    param (
        [string]$codeDpt,
        [string]$codeProgramme
    )

    switch ($codeDpt) {
        20 { return "12$codeProgramme" }
        21 { return "19$codeProgramme" }
        22 { return "13$codeProgramme" }
        23 { return "15$codeProgramme" }
        default { return $codeProgramme }
    }
}

# Étape 2 : Transcoder le code du bien
function TranscoderCodeBien {
    param (
        [string]$codeBien
    )

    return $codeBien -replace '\.00\.', ''
}

# Étape 3 : Envoyer le fichier en FTP
function EnvoyerEnFTP {
    param (
        [string]$cheminLocal,
        [string]$hoteFTP,
        [string]$loginFTP,
        [string]$motDePasseFTP,
        [string]$repertoireFTP
    )

    $sessionFTP = New-Object WinSCP.Session

    try {
        $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
            Protocol = [WinSCP.Protocol]::Sftp
            HostName = $hoteFTP
            UserName = $loginFTP
            Password = $motDePasseFTP
            SshHostKeyFingerprint = "ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
        }

        $sessionFTP.Open($sessionOptions)

        $transferOptions = New-Object WinSCP.TransferOptions
        $transferOptions.TransferMode = [WinSCP.TransferMode]::Binary

        $transferResult = $sessionFTP.PutFiles($cheminLocal, $repertoireFTP, $False, $transferOptions)

        $transferResult.Check()

        Write-Host "Fichier envoyé avec succès!"
    }
    finally {
        $sessionFTP.Dispose()
    }
}


Je n'ai pas encore eu l'occasion de le tester. Mais il me semble bancale. Comment feriez vous cela en trois scripts, un pour chaque étape? 

Merci pour votre aide!
 
Dernière édition: il y a 3 mois 6 jours par Arnaud Petitjean. Raison: Remise en forme du code et du message

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 3 mois 1 semaine #33645 par ericlm128
Bonjour,
As tu un XML d'entré et un exemple de fichier de sortie souhaitez a nous fournir ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 3 mois 1 semaine #33647 par Dead
Bonjour ercilm128, merci pour ton retour.
Je n'ai juste, pour le moment, que le fichier d'entrée. 

Vous trouverez une capture ci-jointe.

Merci et bonne journée!
Pièces jointes :

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 3 mois 1 semaine #33650 par ericlm128
Merci mais je ne pense pas avoir le courage de créer le xml pour test.
Peux tu poser un bout de ce fichier au format xml ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 3 mois 1 semaine #33651 par Dead
Voici un bout de code:

<?xml version="1.0" encoding="ISO-8859-1"?>
<biens>
    <entete>
        <date>02/11/2023</date>
        <nom-service>10938</nom-service>
        <nombre-biens>84</nombre-biens>
        <type-traitement>P</type-traitement>
        <adr-mail-log>mail</adr-mail-log>
    </entete>
    <bien>
        <bien-identification>
            <bien-dpt>22</bien-dpt>
            <bien-organisme>B02</bien-organisme>
            <bien-programme>0616</bien-programme>
            <bien-code>01.00.0001</bien-code>
        </bien-identification>
        <bien-infos>
            <bien-nature>LOG</bien-nature>
            <bien-type-zone>AUT</bien-type-zone>
            <bien-type>T5</bien-type>
            <bien-etage>000</bien-etage>
            <bien-surhab>100.70</bien-surhab>
            <bien-indci>C</bien-indci>
            <bien-ascenseur>0</bien-ascenseur>
            <bien-handicape>0</bien-handicape>
            <bien-neuf>0</bien-neuf>
            <bien-adresse>
                <adr-librue>address</adr-librue>
                <adr-libcomp1></adr-libcomp1>
                <adr-libcomp2></adr-libcomp2>
                <adr-cp>2Code_Postal</adr-cp>
                <adr-ville>VILLE</adr-ville>
                <adr-code-insee>Code INSEE</adr-code-insee>
            </bien-adresse>
            <bien-qrt>X</bien-qrt>
            <bien-finan-actuel>6</bien-finan-actuel>
            <bien-eau-chaude-charge>1</bien-eau-chaude-charge>
            <bien-eau-froide-charge>1</bien-eau-froide-charge>
            <bien-ascenseur-charge>1</bien-ascenseur-charge>
            <bien-chauffage-charge>1</bien-chauffage-charge>
            <bien-chauffage-type>5</bien-chauffage-type>
            <bien-date-premloc>01/06/2023</bien-date-premloc>
            <bien-acquisition></bien-acquisition>
            <bien-domaine>S</bien-domaine>
            <bien-budget>
                <bien-budget-code>10</bien-budget-code>
                <bien-budget-montant>0.00</bien-budget-montant>
              </bien-budget>
              <bien-budget>
                <bien-budget-code>20</bien-budget-code>
                <bien-budget-montant>0.00</bien-budget-montant>
              </bien-budget>
              <bien-budget>
                <bien-budget-code>30</bien-budget-code>
                <bien-budget-montant>0.00</bien-budget-montant>
              </bien-budget>
              <bien-budget>
                <bien-budget-code>90</bien-budget-code>
                <bien-budget-montant>0.00</bien-budget-montant>
              </bien-budget>
              <bien-budget>
                <bien-budget-code>100</bien-budget-code>
                <bien-budget-montant>0.00</bien-budget-montant>
              </bien-budget>
              <bien-budget>
                <bien-budget-code>110</bien-budget-code>
                <bien-budget-montant>0.00</bien-budget-montant>
              </bien-budget>
              <bien-budget>
                <bien-budget-code>120</bien-budget-code>
                <bien-budget-montant>0.00</bien-budget-montant>
              </bien-budget>
              <bien-budget>
                <bien-budget-code>130</bien-budget-code>
                <bien-budget-montant>0.00</bien-budget-montant>
            </bien-budget>
                    <bien-complement>
                    <bien-comp-code>SIG01</bien-comp-code>
                    <bien-comp-val>1</bien-comp-val>
                    </bien-complement>
                    <bien-complement>
                    <bien-comp-code>SIG02</bien-comp-code>
                    <bien-comp-val>1</bien-comp-val>
                    </bien-complement>
                    <bien-complement>
                    <bien-comp-code>SIG03</bien-comp-code>
                    <bien-comp-val>1</bien-comp-val>
                    </bien-complement>
        </bien-infos>
        <bien-vacant>
        <bien-disponible>OUI</bien-disponible>
        <bien-date-dispo>01/06/2023</bien-date-dispo>
        </bien-vacant>
    </bien>

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 3 mois 6 jours - il y a 3 mois 6 jours #33682 par ericlm128
Voici comment je procéderais.
$file_in = "test.xml"
$file_out = "test2.xml"

$codeConverter = @{
    '20' = '12'
    '21' = '19'
    '22' = '13'
    '23' = '15'
}

[System.Xml.XmlDocument] $xml = New-Object "System.XML.XMLDocument"
$xml.PreserveWhitespace = $true
$xml.Load($file_in)

$xml.SelectNodes('/biens/bien/bien-identification') | ForEach-Object {
    $_.'bien-code' = $_.'bien-code' -replace '\.\d{2}\.'

    $code = $codeConverter[$_.'bien-dpt']
    if ($code -eq $null)
    {
        $code = $_.'bien-dpt'
    }
    $_.'bien-programme' = $code + $_.'bien-programme'
}

$xml.Save($file_out)


PS : j'utilise "System.Xml.XmlDocument" pour préserver les espaces du document. Si ceci n'a aucun intérêt pour toi le code peut être simplifié

Désolé mais la partie FTP ne m'excite pas trop
Dernière édition: il y a 3 mois 6 jours par ericlm128.

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.093 secondes
Propulsé par Kunena