Passage xml vers csv - contraire de vbCrLf
Bonjour,
Je suis novice dans le VBA et je fais face à un problème. J'ai réussi tant bien que mal à bidouiller un morceau de code qui me permet, à partir d'un fichier xml, de créer un fichier csv. Mon problème est que mon code créé un une ligne supplémentaire dans mon fichier final à cause de la boucle suivante :
For Each operatorNode In operatorNodes
Dim alpsidOperator As String
alpsidOperator = operatorNode.SelectSingleNode("ALPSID_OPERATOR").Text
Dim day As String
day = operatorNode.SelectSingleNode("DAY").Text
Dim payWorkingTime As String
payWorkingTime = operatorNode.SelectSingleNode("PAY_WORKING_TIME").Text
output = output & alpsidOperator & ",," & "SBBFV-CH,SBBFV,NON-WORK,,,,,,,SBBFV-CH,,," & vbCrLf
output = output & alpsidOperator & ",," & "SBBFV-CH,SBBFV,,," & "507510," & Format(Now(), "yyyy-mm-dd\THH:MM:SS+02:00") & ",,," & payWorkingTime & ",SBBFV-CH," & Format(day, "yyyy-mm-dd\THH:MM:SS+00:00") & ",," & vbCrLf
Next operatorNodeJe l'ai remarqué en utilisant Notepad++ sur le fichier csv créé.
Ma question est donc : est-il possible de rajouter une ligne après le next qui supprimerait ces deux lignes?
le code total est le suivant :
Dim filePath As Variant
filePath = Application.GetOpenFilename("XML Files (*.xml),*.xml", , "Please select an XML file")
If filePath = False Then Exit Sub
Dim xmlDoc As Object
Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
xmlDoc.async = False
xmlDoc.validateOnParse = False
xmlDoc.Load (filePath)
Dim operatorNodes As Object
Set operatorNodes = xmlDoc.SelectNodes("//OPERATOR")
Dim output As String
output = "LABORCODE,LABTRANSID,ORGID_1,SITEID,TRANSTYPE,ATTENDANCEID,ENTERBY,ENTERDATE,FINISHDATE,FINISHTIME,LABORHOURS,ORGID,STARTDATE,STARTTIME,TRANSDATE" & vbCrLf
Dim operatorNode As Object
For Each operatorNode In operatorNodes
Dim alpsidOperator As String
alpsidOperator = operatorNode.SelectSingleNode("ALPSID_OPERATOR").Text
Dim day As String
day = operatorNode.SelectSingleNode("DAY").Text
Dim payWorkingTime As String
payWorkingTime = operatorNode.SelectSingleNode("PAY_WORKING_TIME").Text
output = output & alpsidOperator & ",," & "SBBFV-CH,SBBFV,NON-WORK,,,,,,,SBBFV-CH,,," & vbCrLf
output = output & alpsidOperator & ",," & "SBBFV-CH,SBBFV,,," & "507510," & Format(Now(), "yyyy-mm-dd\THH:MM:SS+02:00") & ",,," & payWorkingTime & ",SBBFV-CH," & Format(day, "yyyy-mm-dd\THH:MM:SS+00:00") & ",," & vbCrLf
Next operatorNode
Dim csvPath As String
csvPath = Left(filePath, Len(filePath) - 3) & "csv"
Open csvPath For Output As #1
Print #1, output
Close #1
MsgBox "CSV file saved at " & csvPathmerci pour votre aide!
Excellente soirée
Cordialement
Pierre
Hello,
Je ne connais pas le traitement de fichier xml mais ce que je ferai c'est :
1 - compter le nombre de nodes
2-Si je suis dans le dernier nodes alors je n'ajoute pas le vbctrl et sinon je l'ajoute
Ce qui donnerai qqch comme ça :
dim lngNodes as long, lngTmp as long
lngNodes = operatorNodes.count
Dim operatorNode As Object
For Each operatorNode In operatorNodes
lngTmp = lngTmp +1
....
....
.....
output = output & alpsidOperator & ",," & "SBBFV-CH,SBBFV,,," & "507510," & Format(Now(), "yyyy-mm-dd\THH:MM:SS+02:00") & ",,," & payWorkingTime & ",SBBFV-CH," & Format(day, "yyyy-mm-dd\THH:MM:SS+00:00") & ",," & iif(lngTmp < lngNodes,vbCrLf,vbnullstring)
Next operatorNodeSalut Rag02700,
Merci pour ton aide et ta proposition! Je l'ai testée et elle fonctionne avec ce petit changement : .count >> .length.
dim lngNodes as long, lngTmp as long
lngNodes = operatorNodes.Length
Dim operatorNode As Object
For Each operatorNode In operatorNodes
lngTmp = lngTmp +1
....
....
.....
output = output & alpsidOperator & ",," & "SBBFV-CH,SBBFV,,," & "507510," & Format(Now(), "yyyy-mm-dd\THH:MM:SS+02:00") & ",,," & payWorkingTime & ",SBBFV-CH," & Format(day, "yyyy-mm-dd\THH:MM:SS+00:00") & ",," & iif(lngTmp < lngNodes,vbCrLf,vbnullstring)
Next operatorNodePour ceux qui pourraient en avoir besoin je vous remets le code complet :
Sub XMLtoCSV()
Dim filePath As Variant
filePath = Application.GetOpenFilename("XML Files (*.xml),*.xml", , "Please select an XML file")
If filePath = False Then Exit Sub
Dim xmlDoc As Object
Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
xmlDoc.async = False
xmlDoc.validateOnParse = False
xmlDoc.Load (filePath)
Dim operatorNodes As Object
Set operatorNodes = xmlDoc.SelectNodes("//OPERATOR")
Dim lngNodes As Long, lngTmp As Long
lngNodes = operatorNodes.Length
Dim output As String
output = "LABORCODE,LABTRANSID,ORGID_1,SITEID,TRANSTYPE,ATTENDANCEID,ENTERBY,ENTERDATE,FINISHDATE,FINISHTIME,LABORHOURS,ORGID,STARTDATE,STARTTIME,TRANSDATE" & vbCrLf
Dim operatorNode As Object
For Each operatorNode In operatorNodes
lngTmp = lngTmp + 1
Dim alpsidOperator As String
alpsidOperator = operatorNode.SelectSingleNode("ALPSID_OPERATOR").Text
Dim day As String
day = operatorNode.SelectSingleNode("DAY").Text
Dim payWorkingTime As String
payWorkingTime = operatorNode.SelectSingleNode("PAY_WORKING_TIME").Text
output = output & alpsidOperator & ",," & "SBBFV-CH,SBBFV,NON-WORK,,,,,,,SBBFV-CH,,," & vbCrLf
output = output & alpsidOperator & ",," & "SBBFV-CH,SBBFV,,," & "507510," & Format(Now(), "yyyy-mm-dd\THH:MM:SS+02:00") & ",,," & payWorkingTime & ",SBBFV-CH," & Format(day, "yyyy-mm-dd\THH:MM:SS+00:00") & ",," & IIf(lngTmp < lngNodes, vbCrLf, vbNullString)
Next operatorNode
Dim csvPath As String
csvPath = Left(filePath, Len(filePath) - 3) & "csv"
Open csvPath For Output As #1
Print #1, output
Close #1
MsgBox "CSV file saved at " & csvPath
End SubExcellente soirée à tous!
Cordialement,