I'm new in code so sorry if may question seems dummy
so I loop on csv datas to build an xml
my issue is that i can only pu 5000 files max in an xml and i need to put more than an million? So i'll to make multiple xml with 5000 files in each The first part of my code is done. Now i need to create a counter who would say in my first "for each" loop that as soon as i've reached 5000 lines (and so 5000 documents) i need to return to the beginnig of my first treatment I can't find a way to produce my multiple xml
do/while do/until and the way to produce it
Here is an example of my csv
UCB63_DATENUM;U6618_FILENAME;UF6E8_CANAL;U65B8_IDRP
7/8/19 22:27;457E6659_ZN_LIQRLVPR_A_V_ML.pdf;ML;1367091
9/11/19 23:03;49453878_ZN_LIQRLVPR_A_V_ML.pdf;ML;106440
9/24/19 21:04;497E585B_ZN_LIQRLVPR_A_V_CS.pdf;CS;1536658
2/12/20 22:12;58453B75_ZN_LIQRLVPR_A_V_ML.pdf;ML;1406091
So i thought i could count the line of the first column and as soon as i reach 5000 I call my first loop
If you need further information just ask, i've got no idea how to do
Ok so i will put you the whole code
$FREQUENCE_DECOMPTE = 'Index Nom="FREQUENCE_DECOMPTE" Valeur="MENS"'
$LIBELLE_ORGANISME = 'Index Nom="LIBELLE_ORGANISME" Valeur="HUMANIS CCN OG"'
$MONTANT_TOTAL = 'Index Nom="MONTANT_TOTAL" Valeur="0"'
$POLE = 'Index Nom="POLE" Valeur="1ADP"'
$CODE_ORGANISME = 'Index Nom="CODE_ORGANISME" Valeur="1ADP"'
$RecupDateFinTraitement = Get-Date
$2ndDate = $recupdatefintraitement.AddDays(30)
$liste = Import-Csv -path C:\Temp\test.csv -Delimiter ';'
Import-Csv -path C:\Temp\test.csv -Delimiter ';'
$boucle = foreach ($list in $liste)
{
$list.U6618_FILENAME
$FREQUENCE_DECOMPTE
$LIBELLE_ORGANISME
$MONTANT_TOTAL
$list.UCB63_DATENUM
$POLE
$CODE_ORGANISME
$list.U6618_FILENAME
$list.U65B8_IDRP
$RecupDateFinTraitement.ToString('dd/MM/yyyy')
$2ndDate.ToString('dd/MM/yyyy')
$ALERTEMAIL.UF6E8_CANAL
$fin = $list.UF6E8_CANAL -match "ML"
if ($list.UF6E8_CANAL -match "ML"){1}
else {0}
**## Compteur
$Compte = Get-Content C:\Temp\test.csv | Measure-Object -Line
$compte.lines
if ($Compte.Lines -gt 2)
{
do{$boucle} until ($Compte -gt 5)
}**
}
$boucle | Out-File -FilePath C:\Temp\test2.txt
I don't think explainig the xml would help i just want to lool inside the first loop in order to relaunche the first loop called $boucle if i reach 5000 documents in the first output file (or maybe easier as soon as i reach the 5000th line of the csv) I still have work on the shape of the xml as you see by the name of the output file
Regards
Not sure of course how you would like to format your XML, but the below code should give you a way to do it.
$FREQUENCE_DECOMPTE = 'Nom="FREQUENCE_DECOMPTE" Valeur="MENS"'
$LIBELLE_ORGANISME = 'Nom="LIBELLE_ORGANISME" Valeur="HUMANIS CCN OG"'
$MONTANT_TOTAL = 'Nom="MONTANT_TOTAL" Valeur="0"'
$POLE = 'Nom="POLE" Valeur="1ADP"'
$CODE_ORGANISME = 'Nom="CODE_ORGANISME" Valeur="1ADP"'
# read the csv file
$liste = Import-Csv -path 'D:\Test\test.csv' -Delimiter ';'
# get the total remaining records to process
$remaining = $liste.Count
# set a maximum value of items for each resulting XML file
$maxItemsPerXml = 3
# set a xml output file counter and an item index counter
$xmlFileCount = 1
$currentItem = 0
# loop through all items
while ($remaining -gt 0) {
$itemCount = [math]::Min($maxItemsPerXml, $remaining)
$xmlItems = for ($i = 0; $i -lt $itemCount; $i++) {
$item = $liste[$i + $currentItem]
$fin = if ($item.UF6E8_CANAL -eq "ML") {1} else {0}
# parse the date from the 'UCB63_DATENUM' field
$date = [datetime]::ParseExact($item.UCB63_DATENUM, 'M/d/yy HH:mm', $null)
$RecupDateFinTraitement = $date.ToString('dd/MM/yyyy')
$RecupDateFin30 = $date.AddDays(30).ToString('dd/MM/yyyy')
# output each item in xml-style
# you can change the element names to whatever you want of course
@"
<Item>
<U6618_FILENAME>$($item.U6618_FILENAME)</U6618_FILENAME>
<Indices>
<Index $FREQUENCE_DECOMPTE></Index>
<Index $LIBELLE_ORGANISME></Index>
<Index $MONTANT_TOTAL></Index>
<Index $POLE></Index>
<Index $CODE_ORGANISME></Index>
</Indices>
<UCB63_DATENUM>$($item.UCB63_DATENUM)</UCB63_DATENUM>
<U65B8_IDRP>$($item.U65B8_IDRP)</U65B8_IDRP>
<RecupDateFinTraitement>$RecupDateFinTraitement</RecupDateFinTraitement>
<RecupDateFin30>$RecupDateFin30</RecupDateFin30>
<ALERTEMAIL>$($item.UF6E8_CANAL)</ALERTEMAIL>
<Fin>$fin</Fin>
</Item>
"@
}
# create a complete file path and name for the output xml
$xmlFile = 'D:\Test\Test_{0:D8}.xml' -f $xmlFileCount
# create the XML content, complete with declaration and root node and write it to file
@"
<?xml version="1.0" encoding="utf-8"?>
<root>
$($xmlItems -join "`r`n")
</root>
"@ | Set-Content -Path $xmlFile -Encoding UTF8
# update the counters
$xmlFileCount++
$remaining -= $itemCount
$currentItem += $itemCount
}
You may want to tinker with the way the XML is now built using Here-String templates. I simply took the header names from the CSV as element names, except for the indices variables you defined in all caps.
From those I took off the Index
part and set that as element name.
Output using your example CSV and $maxItemsPerXml = 3
, will be 2 files called Test_00000001.xml
and Test_00000002.xml
.
Test_00000001.xml
<?xml version="1.0" encoding="utf-8"?>
<root>
<Item>
<U6618_FILENAME>457E6659_ZN_LIQRLVPR_A_V_ML.pdf</U6618_FILENAME>
<Indices>
<Index Nom="FREQUENCE_DECOMPTE" Valeur="MENS"></Index>
<Index Nom="LIBELLE_ORGANISME" Valeur="HUMANIS CCN OG"></Index>
<Index Nom="MONTANT_TOTAL" Valeur="0"></Index>
<Index Nom="POLE" Valeur="1ADP"></Index>
<Index Nom="CODE_ORGANISME" Valeur="1ADP"></Index>
</Indices>
<UCB63_DATENUM>7/8/19 22:27</UCB63_DATENUM>
<U65B8_IDRP>1367091</U65B8_IDRP>
<RecupDateFinTraitement>08-07-2019</RecupDateFinTraitement>
<RecupDateFin30>07-08-2019</RecupDateFin30>
<ALERTEMAIL>ML</ALERTEMAIL>
<Fin>1</Fin>
</Item>
<Item>
<U6618_FILENAME>49453878_ZN_LIQRLVPR_A_V_ML.pdf</U6618_FILENAME>
<Indices>
<Index Nom="FREQUENCE_DECOMPTE" Valeur="MENS"></Index>
<Index Nom="LIBELLE_ORGANISME" Valeur="HUMANIS CCN OG"></Index>
<Index Nom="MONTANT_TOTAL" Valeur="0"></Index>
<Index Nom="POLE" Valeur="1ADP"></Index>
<Index Nom="CODE_ORGANISME" Valeur="1ADP"></Index>
</Indices>
<UCB63_DATENUM>9/11/19 23:03</UCB63_DATENUM>
<U65B8_IDRP>106440</U65B8_IDRP>
<RecupDateFinTraitement>11-09-2019</RecupDateFinTraitement>
<RecupDateFin30>11-10-2019</RecupDateFin30>
<ALERTEMAIL>ML</ALERTEMAIL>
<Fin>1</Fin>
</Item>
<Item>
<U6618_FILENAME>497E585B_ZN_LIQRLVPR_A_V_CS.pdf</U6618_FILENAME>
<Indices>
<Index Nom="FREQUENCE_DECOMPTE" Valeur="MENS"></Index>
<Index Nom="LIBELLE_ORGANISME" Valeur="HUMANIS CCN OG"></Index>
<Index Nom="MONTANT_TOTAL" Valeur="0"></Index>
<Index Nom="POLE" Valeur="1ADP"></Index>
<Index Nom="CODE_ORGANISME" Valeur="1ADP"></Index>
</Indices>
<UCB63_DATENUM>9/24/19 21:04</UCB63_DATENUM>
<U65B8_IDRP>1536658</U65B8_IDRP>
<RecupDateFinTraitement>24-09-2019</RecupDateFinTraitement>
<RecupDateFin30>24-10-2019</RecupDateFin30>
<ALERTEMAIL>CS</ALERTEMAIL>
<Fin>0</Fin>
</Item>
</root>
Test_00000002.xml
<?xml version="1.0" encoding="utf-8"?>
<root>
<Item>
<U6618_FILENAME>58453B75_ZN_LIQRLVPR_A_V_ML.pdf</U6618_FILENAME>
<Indices>
<Index Nom="FREQUENCE_DECOMPTE" Valeur="MENS"></Index>
<Index Nom="LIBELLE_ORGANISME" Valeur="HUMANIS CCN OG"></Index>
<Index Nom="MONTANT_TOTAL" Valeur="0"></Index>
<Index Nom="POLE" Valeur="1ADP"></Index>
<Index Nom="CODE_ORGANISME" Valeur="1ADP"></Index>
</Indices>
<UCB63_DATENUM>2/12/20 22:12</UCB63_DATENUM>
<U65B8_IDRP>1406091</U65B8_IDRP>
<RecupDateFinTraitement>12-02-2020</RecupDateFinTraitement>
<RecupDateFin30>13-03-2020</RecupDateFin30>
<ALERTEMAIL>ML</ALERTEMAIL>
<Fin>1</Fin>
</Item>
</root>