IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Temps de traitement xml_to_cvs.


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    dsi
    Inscrit en
    Mars 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dsi

    Informations forums :
    Inscription : Mars 2003
    Messages : 13
    Par défaut Temps de traitement xml_to_cvs.
    Bonjour à tous,

    Je suis sur un script qui à pour objectif de convertir un fichier XML en CSV.
    Je dois faire cette conversion pour faciliter une intégration SSIS, qui plante régulièrement sur ce fichier ...

    Mon problème est le temps de traitement ... 45 mn ! Que puis je faire pour améliorer ce temps de traitement, sachant que je n'ai pas la main sur la structure du XML.
    Le fichier XML fait 2.2M de lignes.
    Il contient en particulier un 'item' avec 96 'sous items', d'ou la sous boucle ...

    Grand merci à tous pour votre expertise et vos remarques.

    Bonne journée.

    Voici mon script :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    #Convertir un fichier xml to csv
    function xml_to_csv() {
    	[xml]$xmlfull = (Get-Content \\........\XMLCatalogue\HW7841296.xml -Encoding UTF8)
    	#$xmlfull.catalog.data.item | ConvertTo-Csv -NoTypeInformation -Delimiter ";" | Set-Content "C:\Users\utran\Desktop\XMLCatalogue\new.csv" -Encoding UTF8
    	#Out-file -FilePath "C:\TEST_CSV.csv" -Encoding Ascii -InputObject $xmlfull
    	$itemsNode = $xmlfull.SelectNodes('//item')
    	# Tableau pour stocker l'ensemble les items
    	$items = [PsCustomObject]@()
    	# Parcourrir tous les items dans la liste
    	$a = 0
    	foreach($item_xml in $itemsNode) {
    		Write-host $a 
    		$extened_fields = [PsCustomObject]@()
    		#Analyse ensemble les extended fields
    		$extened_fields_xml = $item_xml.ExtendedFields
    		foreach($extened_field in $extened_fields_xml.field) {
    			$extened_field = [PsCustomObject]@{
    				name = $extened_field.name
    				'#text' = $extened_field.'#text'
    			}
    			$extened_fields += $extened_field
    		}
    		#$extended_fields_result = ""
    		#for($i = 0; $i -lt $extened_fields.name.count; $i++) {
    		#	if ($extened_fields[$i].'#text' -eq $null) {
    		#			$extened_fields[$i].'#text' = ""
    		#	}
    		#	$extended_fields_result += $extened_fields[$i].name + " = " + $extened_fields[$i].'#text' + "`n"
     
    		#}
     
    		#Création d'un objet 
    		$item_ajout = [PsCustomObject]@{
    			ACTION_CODE = $item_xml.ACTION_CODE
    			LANGUAGE_CODE = $item_xml.LANGUAGE_CODE
    			DESCRIPTION_SHORT = $item_xml.DESCRIPTION_SHORT
    			BUYER_KEYWORDS = $item_xml.BUYER_KEYWORDS
    			SUPPLIER_ITEM_NUMBER = $item_xml.SUPPLIER_ITEM_NUMBER
    			SUPPLIER_NAME = $item_xml.SUPPLIER_NAME
    			MANUFACTURER_ITEM_NUMBER = $item_xml.MANUFACTURER_ITEM_NUMBER 
    			MANUFACTURER_NAME = $item_xml.MANUFACTURER_NAME
    			MIDDLE_DESCRIPTION = $item_xml.MIDDLE_DESCRIPTION
    			DESCRIPTION_LONG = $item_xml.DESCRIPTION_LONG
    			PRICE_CURRENCY_1 = $item_xml.PRICE_CURRENCY_1
    			PRICE_1 = $item_xml.PRICE_1
    			UNIT_OF_MEASURE = $item_xml.UNIT_OF_MEASURE
    			QUANTITY = $item_xml.QUANTITY
    			CONTENT_UNIT = $item_xml.CONTENT_UNIT
    			ITEM_STATUS = $item_xml.ITEM_STATUS
    			PRICE_2 = $item_xml.PRICE_2
    			LOWER_BOUND_PRICE_2 = $item_xml.LOWER_BOUND_PRICE_2
    			PRICE_3 = $item_xml.PRICE_3
    			LOWER_BOUND_PRICE_3 = $item_xml.LOWER_BOUND_PRICE_3
    			PRICE_4 = $item_xml.PRICE_4
    			LOWER_BOUND_PRICE_4 = $item_xml.LOWER_BOUND_PRICE_4
    			PRICE_5 = $item_xml.PRICE_5
    			LOWER_BOUND_PRICE_5 = $item_xml.LOWER_BOUND_PRICE_5
    			LIST_PRICE1 = $item_xml.LIST_PRICE1
    			MINIMUM_ORDER_QUANTITY = $item_xml.MINIMUM_ORDER_QUANTITY
    			ORDER_QUANTITY_INTERVAL = $item_xml.ORDER_QUANTITY_INTERVAL
    			DELIVERY_TIME = $item_xml.DELIVERY_TIME
    			PRICE_VALID_FROM = $item_xml.PRICE_VALID_FROM
    			PRICE_VALID_TO = $item_xml.PRICE_VALID_TO
    			EXTRA_LINK_C1 = $item_xml.EXTRA_LINK_C1
    			CUSTOMER_PICTURE = $item_xml.CUSTOMER_PICTURE
    			LABEL_C2 = $item_xml.LABEL_C2
    			EXTRA_LINK_C2 = $item_xml.EXTRA_LINK_C2
    			LABEL_C3 = $item_xml.LABEL_C3
    			EXTRA_LINK_C3 = $item_xml.EXTRA_LINK_C3
    			LABEL_C4 = $item_xml.LABEL_C4
    			EXTRA_LINK_C4 = $item_xml.EXTRA_LINK_C4
    			EXTRA_LINK_C5 = $item_xml.EXTRA_LINK_C5
    			TAX_RATE = $item_xml.TAX_RATE
    			EAN = $item_xml.EAN
    			MANUFACTURER_COUNTRY = $item_xml.MANUFACTURER_COUNTRY 
    			CUSTOMER_SPECIFIC_FIELD5 = $item_xml.CUSTOMER_SPECIFIC_FIELD5
    			CUSTOMER_SPECIFIC_FIELD3 = $item_xml.CUSTOMER_SPECIFIC_FIELD3
    			CUSTOMER_SPECIFIC_FIELD6 = $item_xml.CUSTOMER_SPECIFIC_FIELD6
    			CLASSIFICATION_CODE = $item_xml.CLASSIFICATION_CODE
    			CUSTOMER_SPECIFIC_FIELD7 = $item_xml.CUSTOMER_SPECIFIC_FIELD7
    			CUSTOMER_SPECIFIC_FIELD8 = $item_xml.CUSTOMER_SPECIFIC_FIELD8
    			LABEL_TYPE_C6 = $item_xml.LABEL_TYPE_C6
    			EXTRA_LINK_C6 =$item_xml.EXTRA_LINK_C6
    			LABEL_C6 = $item_xml.LABEL_C6
    			LABEL_TYPE_C7 = $item_xml.LABEL_TYPE_C7
    			EXTRA_LINK_C7 = $item_xml.EXTRA_LINK_C7
    			LABEL_C7 = $item_xml.LABEL_C7
    			LABEL_TYPE_C8 = $item_xml.LABEL_TYPE_C8
    			EXTRA_LINK_C8 = $item_xml.EXTRA_LINK_C8
    			LABEL_C8 = $item_xml.LABEL_C8
    			LABEL_TYPE_C9 = $item_xml.LABEL_TYPE_C9
    			EXTRA_LINK_C9 = $item_xml.EXTRA_LINK_C9
    			LABEL_C9 = $item_xml.LABEL_C9
    			LABEL_TYPE_C10 = $item_xml.LABEL_TYPE_C10
    			EXTRA_LINK_C10 = $item_xml.EXTRA_LINK_C10
    			LABEL_C10 = $item_xml.LABEL_C10
    		}
     
    		#Ajout les properties extended fields dans l'objet
    		for($i = 0; $i -lt $extened_fields.name.count; $i++) {
    			$item_ajout | add-member Noteproperty $extened_fields[$i].name $extened_fields[$i].'#text'
    		}
    		$a = $a + 1
    		#$items += $item_ajout
    		$item_ajout  | Export-Csv -Path 'C:\Users\utran\Desktop\XMLCatalogue\testCSVUYDU.csv' -NoTypeInformation -Append -Encoding UTF8 -Force
    		Clear-Variable $extened_fields_xml
    		#item_add = $item_ajout | ConvertTo-Csv -NoTypeInformation -Delimiter ";"
    		#Out-file -FilePath "C:\Users\utran\Desktop\XMLCatalogue\testCSVUYDU.csv" -Encoding Ascii -InputObject $item_add -Append
    	}
    	$items = @()
    	#Out-file -FilePath "C:\Users\utran\Desktop\XMLCatalogue\testCSVUYDU.csv" -Encoding Ascii -InputObject $items
    	#$items | Export-Csv -Path 'C:\Users\utran\Desktop\XMLCatalogue\testCSVUYDU.csv' -NoTypeInformation -Encoding ascii
    }

    Ci-dessous un exemple d'item avec son sous item :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    <catalog>
    	<header>
    		<customer>407000133-0020</customer>
    		<supplier>HW7841295</supplier>
    	</header>
    	<data>
    		<item>
    			<ACTION_CODE></ACTION_CODE>
    			<LANGUAGE_CODE>fr</LANGUAGE_CODE>
    			<DESCRIPTION_SHORT>VAMINOLACT FL VERRE 1000 ML</DESCRIPTION_SHORT>
    			<BUYER_KEYWORDS>18,91</BUYER_KEYWORDS>
    			<SUPPLIER_ITEM_NUMBER>3400932998098</SUPPLIER_ITEM_NUMBER>
    			<SUPPLIER_NAME>FRESENIUS KABI</SUPPLIER_NAME>
    			<MANUFACTURER_ITEM_NUMBER>3400891237153</MANUFACTURER_ITEM_NUMBER>
    			<MANUFACTURER_NAME>-</MANUFACTURER_NAME>
    			<MIDDLE_DESCRIPTION>MELANGE AA PR NUTRITION PARENTERALE PEDIATRIQUE - FORME INJECTABLE 1 000ML</MIDDLE_DESCRIPTION>
    			<DESCRIPTION_LONG>-</DESCRIPTION_LONG>
    			<PRICE_CURRENCY_1>EUR</PRICE_CURRENCY_1>
    			<PRICE_1>0,000001</PRICE_1>
    			<UNIT_OF_MEASURE>EA</UNIT_OF_MEASURE>
    			<QUANTITY>1</QUANTITY>
    			<CONTENT_UNIT>EA</CONTENT_UNIT>
    			<ITEM_STATUS></ITEM_STATUS>
    			<PRICE_2></PRICE_2>
    			<LOWER_BOUND_PRICE_2></LOWER_BOUND_PRICE_2>
    			<PRICE_3></PRICE_3>
    			<LOWER_BOUND_PRICE_3></LOWER_BOUND_PRICE_3>
    			<PRICE_4></PRICE_4>
    			<LOWER_BOUND_PRICE_4></LOWER_BOUND_PRICE_4>
    			<PRICE_5></PRICE_5>
    			<LOWER_BOUND_PRICE_5></LOWER_BOUND_PRICE_5>
    			<LIST_PRICE1></LIST_PRICE1>
    			<MINIMUM_ORDER_QUANTITY>6</MINIMUM_ORDER_QUANTITY>
    			<ORDER_QUANTITY_INTERVAL></ORDER_QUANTITY_INTERVAL>
    			<DELIVERY_TIME>0</DELIVERY_TIME>
    			<PRICE_VALID_FROM>01.01.2020 00:00:00</PRICE_VALID_FROM>
    			<PRICE_VALID_TO>31.12.2022 00:00:00</PRICE_VALID_TO>
    			<EXTRA_LINK_C1></EXTRA_LINK_C1>
    			<CUSTOMER_PICTURE>Fresenius_Kabi.png</CUSTOMER_PICTURE>
    			<LABEL_C2></LABEL_C2>
    			<EXTRA_LINK_C2></EXTRA_LINK_C2>
    			<LABEL_C3></LABEL_C3>
    			<EXTRA_LINK_C3></EXTRA_LINK_C3>
    			<LABEL_C4></LABEL_C4>
    			<EXTRA_LINK_C4></EXTRA_LINK_C4>
    			<EXTRA_LINK_C5></EXTRA_LINK_C5>
    			<TAX_RATE>2,1</TAX_RATE>
    			<EAN></EAN>
    			<MANUFACTURER_COUNTRY></MANUFACTURER_COUNTRY>
    			<CUSTOMER_SPECIFIC_FIELD5></CUSTOMER_SPECIFIC_FIELD5>
    			<CUSTOMER_SPECIFIC_FIELD3>Médicaments</CUSTOMER_SPECIFIC_FIELD3>
    			<CUSTOMER_SPECIFIC_FIELD6>03</CUSTOMER_SPECIFIC_FIELD6>
    			<CLASSIFICATION_CODE>MED03</CLASSIFICATION_CODE>
    			<CUSTOMER_SPECIFIC_FIELD7></CUSTOMER_SPECIFIC_FIELD7>
    			<CUSTOMER_SPECIFIC_FIELD8></CUSTOMER_SPECIFIC_FIELD8>
    			<LABEL_TYPE_C6>A</LABEL_TYPE_C6>
    			<EXTRA_LINK_C6>LilleMDT.docx</EXTRA_LINK_C6>
    			<LABEL_C6>CHU Lille - Coordonnée de la filière</LABEL_C6>
    			<LABEL_TYPE_C7>U</LABEL_TYPE_C7>
    			<EXTRA_LINK_C7>https://www.uniha.org/marche/m_1631/</EXTRA_LINK_C7>
    			<LABEL_C7>Accéder au marché</LABEL_C7>
    			<LABEL_TYPE_C8></LABEL_TYPE_C8>
    			<EXTRA_LINK_C8></EXTRA_LINK_C8>
    			<LABEL_C8></LABEL_C8>
    			<LABEL_TYPE_C9></LABEL_TYPE_C9>
    			<EXTRA_LINK_C9></EXTRA_LINK_C9>
    			<LABEL_C9></LABEL_C9>
    			<LABEL_TYPE_C10></LABEL_TYPE_C10>
    			<EXTRA_LINK_C10></EXTRA_LINK_C10>
    			<LABEL_C10></LABEL_C10>
    			<ExtendedFields>
    				<field name="CUSTOMER_SPECIFIC_FIELD11"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD12">19,30711</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD13">Ferme</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD14">Alimentation</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD15"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD16"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD17">01/01/2020 - 31/12/2022</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD18">MEDICA LILLE</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD19"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD20">-</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD21">-</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD22"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD23"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD24"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD25"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD26"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD28"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD29"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD30"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD31"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD32"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD33"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD34"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD35"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD36"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD37"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD38"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD39"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD40"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD41">oui</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD42">6</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD43">Marché</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD44"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD45"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD46"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD47"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD48"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD49"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD50"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD51"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD52"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD53"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD54"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD55"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD56"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD57">B05BA01</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD58">-</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD59">SNAOG_2020 - M_1631</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD60">Disponible en CENTRALE d'ACHAT</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD61"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD62"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD63"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD64"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD65"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD66"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD67">00_UNIH 00_CATA</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD68">Lot 136 : MELANGE AA PR NUTRITION PARENTERALE PEDIATRIQUE - Sous lot 3 : FORME INJECTABLE 1 000ML</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD69">199435</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD70">-</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD71">stock</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD72"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD73"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD74"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD75">-</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD76"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD77"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD79">NUTRITION PARENTÉRALE ET SOLUTÉS MASSIFS/PETITES A</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD80">136</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD81">MELANGE AA PR NUTRITION PARENTERALE PEDIATRIQUE</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD82">3</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD83">FORME INJECTABLE 1 000ML</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD84"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD85"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD86"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD87"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD88"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD89"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD90"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD91"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD92"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD93"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD94"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD95"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD96"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD98"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD99"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD100"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD101"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD102"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD103"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD104"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD105"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD106"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD107"></field>
    				<field name="CUSTOMER_SPECIFIC_FIELD108">MED</field>
    				<field name="CUSTOMER_SPECIFIC_FIELD109">MEDICAMENT</field>
    			</ExtendedFields>
    		</item>

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Vu qu'il s'agit d'un problème de performance sur le traitement d'un ensemble peux tu poster un fichier complet XML pour test stp.
    Sur 1 item je ne suis pas sûr que nous constations et résolvions le souci.

  3. #3
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    J'ai un petite complexité sur le traitement, est ce que les items ont tous la même structure et possèdent les mêmes noms d'entrées (Name) ?

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Après étude, je te propose ceci

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Function UnifyProperties {
        $InputCollected = @($Input)
        $Properties = $InputCollected | ForEach-Object {$_.PSObject.Properties.Name}
        $PropertiesDistinct = [string[]]([Linq.Enumerable]::Distinct([string[]]@($Properties), [System.StringComparer]::OrdinalIgnoreCase))
        $InputCollected | Select-Object @($PropertiesDistinct)
    }
     
    $content = Get-Content -LiteralPath "${PSScriptRoot}\test.xml" -Raw -Encoding UTF8
    $xmlfull = [xml]$content
     
    $Result = foreach($itemNode in $xmlfull.SelectNodes('//item'))
    {
        $ResultItem = [PsCustomObject] @{}
        $Nodes = @($itemNode.ChildNodes | Where-Object {$_.Name -ne "ExtendedFields"}) + @($item_xml.ExtendedFields.ChildNodes)
        $Nodes | ForEach-Object {
            Add-Member -InputObject $ResultItem -MemberType NoteProperty -Name $_.Name -Value $_.'#text'
        }
        $ResultItem
    }
     
    $Result | UnifyProperties | Export-Csv -Path "${PSScriptRoot}\testCSVUYDU.csv" -NoTypeInformation -Append -Encoding UTF8 -Force

  5. #5
    Membre averti
    Profil pro
    dsi
    Inscrit en
    Mars 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dsi

    Informations forums :
    Inscription : Mars 2003
    Messages : 13
    Par défaut Super ! Merci pour vos retour.
    Bonsoir,

    Grand merci à vous pour ces retours. J'ai été bien pris mais me replonge dans le sujet.
    @ericlm128 je vais tester ton code et surtout le comprendre, je te fais un retour dessus demain.

    Je vais poster demain aussi un échantillon anonymisé comme demandé.

    Dans tous les cas merci !
    Vous tiens au courant.

    ZZ

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    il y a une coquille dans le nom de variable $item_xml, c’est $ItemNode.

    Pour info le xml d’exemple est mal formé.



    QQ remarques sur le code d’Eric :

    Je n’ai pas compris la présence de UnifyProperties.

    Pour ceci :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      $Result = foreach($itemNode in $xmlfull.SelectNodes('//item'))
      {
          $ResultItem = [PsCustomObject] @{}
         $Nodes = @($itemNode.ChildNodes | Where-Object {$_.Name -ne "ExtendedFields"}) + @($ItemNode.ExtendedFields.ChildNodes)
          $Nodes | ForEach-Object {
              Add-Member -InputObject $ResultItem -MemberType NoteProperty -Name $_.Name -Value $_.'#text'
         }
          $ResultItem
      }

    Etant dans l’optimisation on peut gagner, certes très peu, en temps de traitement :
    Il n’est pas nécessaire de parser une hashtable vide, ceci est équivalent :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
      [PsCustomObject]::New()

    Si l’on utilise pas la substitution de chaîne alors utiliser de simples quottes :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
      {$_.Name -ne ‘ExtendedFields’}
    On gagne très peu mais de nombreuse fois.


    Ensuite je me suis demandé si on pouvait essayer de simplifier, et peut être accélérer ce traitement en supprimant le Add-Member.
    Pour la construction du tableau $Nodes on évite la première boucle de recherche (je suppose la propriété ( le nœud XML) ‘ExtendedFields’ unique).

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
      $f='C:\temp\datas.xml'
     
     
     
      $content = Get-Content $f -Raw -Encoding UTF8
     
      $xmlfull = [xml]$content
     
     
      $Result = foreach($itemNode in $xmlfull.SelectNodes('//item'))
      {
                      $NodeProperties=@{}
                      $ExtendedFields=$ItemNode.ExtendedFields.ChildNodes
                      $ItemNode.RemoveChild($ItemNode['ExtendedFields']) > $Null
                      @($itemNode.ChildNodes,$ExtendedFields)|
     
                      ForEach-Object { 
                        $_|
                         ForEach-Object {
                                     $NodeProperties.Add($_.Name,$_.'#text')
                       }
                      }
          [PsCustomObject]$NodeProperties
      }
      $result
    On construit une hashtable, ce qui me semble similaire aux appels a Add-member, que l’on couple à la construction d’un PsObject.

    Pour RemoveChild on supprime la propriété mais pas l’objet qui est désormais référencé par $ExtendedFields.
    Et pour la boucle imbriquée je n’ai pas pris le temps de trouver mieux.

    Est-ce pertinent ? Je ne sais pas car je n’ai pas testé sur le fichier d’origine.

    Au mieux ce sera une autre manière de faire 😊

Discussions similaires

  1. Utilisation JProgressBar & temps de traitement incconu
    Par greg1602 dans le forum Composants
    Réponses: 22
    Dernier message: 30/11/2005, 20h52
  2. [Tableaux] Temps de traitement ... affichage de page
    Par mathieu77186 dans le forum Langage
    Réponses: 37
    Dernier message: 25/10/2005, 17h45
  3. [MySql] temps de traitement interminable
    Par LE NEINDRE dans le forum Requêtes
    Réponses: 8
    Dernier message: 08/07/2005, 15h14
  4. [Perf]Utilisation des Logger et temps de traitement ?
    Par elitost dans le forum Logging
    Réponses: 6
    Dernier message: 12/04/2005, 23h13
  5. optimisation de temps de traitement xml/xslt
    Par Erwy dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/05/2004, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo