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:
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:
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> |
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 ! :D
Vous tiens au courant.
ZZ