PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 17/07/2019 09:02:10

oles67
Membre

Format Export fichier XML

Bonjour,

J'utilise Pgsql 9.6
Actuellement, les exports sont fait en CSV avec "COPY (SELECT......) TO file", mais j'aimerai les faire en XML.
Le fichier CSV fait 5Mo (Zip750Ko) , contre 27Mo pour le Xml (Zip5,5Mo)

Je sais que le XML est très bavard (chaque valeur a une balise ouverte et fermée). En temps normal, je le simplifie en structurant un format qui ressemble un peu à du CSV. Une balise contient toutes les valeurs d'une ligne de CSV avec comme séparateur ";". Ex :

<Data>
    <annee id="2018">
        <Janvier> 0001_2018 ; 0101_2018 ; 0301_2018 </Janvier>
        <Fevrier> 0002_2018 ; 0102_2018 ; 0302_2018 </Fevrier>
    </annee>
    <annee id="2019">
        <Janvier> 0001_2019 ; 0101_2019 ; 0301_2019 </Janvier>
        <Fevrier> 0002_2019 ; 0102_2019 ; 0302_2019 </Fevrier>
    </annee>
</Data>

Dans Excel, pour retrouver le format type tableau, j'édite la requête  :
Table.ReorderColumns(#"Type modifié2",{"Attribute:id", "Janvier.1", "Janvier.2", "Janvier.3", "Fevrier.1", "Fevrier.2", "Fevrier.3"})

    ActiveWorkbook.Queries.Add Name:="annee (3)", Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Source = Xml.Tables(File.Contents(""\\Network\C\Temp\textXML3.xml""))," & Chr(13) & "" & Chr(10) & "    Table0 = Source{0}[Table]," & Chr(13) & "" & Chr(10) & "    #""Type modifié"" = Table.TransformColumnTypes(Table0,{{""Janvier"", type text}, {""Fevrier"", type text}, {""Attribute:id"", Int64.Type}})," & Chr(13) & "" & Chr(10) & "    #""Fractionner la colonne par délimiteur"" = Table.SplitColumn(#""Type modifié"",""Janvier"",Splitter.Sp" & _
        "litTextByDelimiter("";""),{""Janvier.1"", ""Janvier.2"", ""Janvier.3""})," & Chr(13) & "" & Chr(10) & "    #""Type modifié1"" = Table.TransformColumnTypes(#""Fractionner la colonne par délimiteur"",{{""Janvier.1"", type text}, {""Janvier.2"", type text}, {""Janvier.3"", type text}})," & Chr(13) & "" & Chr(10) & "    #""Fractionner la colonne par délimiteur1"" = Table.SplitColumn(#""Type modifié1"",""Fevrier"",Splitter.Sp" & _
        "litTextByDelimiter("";""),{""Fevrier.1"", ""Fevrier.2"", ""Fevrier.3""})," & Chr(13) & "" & Chr(10) & "    #""Type modifié2"" = Table.TransformColumnTypes(#""Fractionner la colonne par délimiteur1"",{{""Fevrier.1"", type text}, {""Fevrier.2"", type text}, {""Fevrier.3"", type text}})," & Chr(13) & "" & Chr(10) & "    #""Colonnes triées"" = Table.ReorderColumns(#""Type modifié2"",{""Attribute:id"", ""Janvier.1"", ""Janvie" & _
        "r.2"", ""Janvier.3"", ""Fevrier.1"", ""Fevrier.2"", ""Fevrier.3""})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    #""Colonnes triées"""
    Sheets.Add After:=ActiveSheet
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""annee (3)""" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [annee (3)]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = False
        .ListObject.DisplayName = "annee__3"
        .Refresh BackgroundQuery:=False
    End With

Par contre, pour ce qui concerne l'export d'une requête vers un fichier XML, je coince et j'ai besoin d'une piste ou d'un exemple existant pour créer ma structure du fichier XML comme dans mon exemple. La bdd est générée par un logiciel externe et je ne peut pas modifier sa structure (table, schema,...).
Par contre, je peux créer des function, tables (pour le schema, je ne sais pas)

Est-ce qu'il déjà existe un moyen avec postgre, ça m'évitera de réinventer la roue, ou bien est-il possible de le faire avec une fonction perso ?

Merci de votre aide.

Hors ligne

#2 17/07/2019 14:38:49

oles67
Membre

Re : Format Export fichier XML

Je me répond en partie à moi même pour la partie concaténation des valeurs sur une ligne.
J'ai essayé avec CONCAT(), mais le nombre d'arguments est limité à 100 (50 champs + 50 délimiteurs) alors qu'il me faut 98 champs et 97 délimiteurs.
Je suis donc passé par : Champ1 || '';'' || Champ2 || '';'' || Champ3

COPY( select query_to_xml(
'select Nom, date, 
	Champ1 || '';'' ||
	Champ2 || '';'' ||
	Champ3
AS Concat
from 
	public.Temp_Table4', false , false, '')
        ) 
TO 'c:\temp\tempTestConcat.xml'  CSV QUOTE AS ' '

C'est pas parfait, mais actuellement j'arrive à ce qui suit et j'aimerai fusionner les <annee id="2018"> ensemble et idem pour 2019 et et n'avoir qu'un <Row>
Si vous avez une idée, je dormirai moins bête ce soir.


<Row>
    <annee id="2018">
        <Janvier> 0101_2018 ; 0201_2018 ; 0301_2018 </Janvier>
    </annee>
</Row>

<Row>
    <annee id="2018">
        <Fevrier> 0102_2018 ; 0202_2018 ; 0302_2018 </Fevrier>
    </annee>
</Row>

<Row>
    <annee id="2019">
        <Janvier> 0101_2019 ; 0201_2019 ; 0301_2019 </Janvier>
    </annee>
</Row>

<Row>
    <annee id="2019">
        <Fevrier> 0102_2019 ; 0202_2019 ; 0302_2019 </Fevrier>
    </annee>
</Row>

Rien qu'avec ça, je passe le fichier XML de 27Mo à 5,7Mo contre 5,2Mo pour le CSV.

Dernière modification par oles67 (17/07/2019 14:39:35)

Hors ligne

#3 31/07/2019 10:14:35

duple
Membre

Re : Format Export fichier XML

Salut,
Si çà peut aider, existe un logiciel "Navicat" qui permet de se connecter sur plusieurs SGBD, tel que Oracle, PG, Mysql, ... et on peut exécuter des requêtes dedans, on peut également exporter les données sous plusieurs format : le xml y compris. Tu peux même paramétrer çà pour que çà se lance en tache planifiée, super le soft non smile

Hors ligne

#4 01/08/2019 11:07:36

oles67
Membre

Re : Format Export fichier XML

duple a écrit :

Salut,
Si çà peut aider, existe un logiciel "Navicat" qui permet de se connecter sur plusieurs SGBD, tel que Oracle, PG, Mysql, ... et on peut exécuter des requêtes dedans, on peut également exporter les données sous plusieurs format : le xml y compris. Tu peux même paramétrer çà pour que çà se lance en tache planifiée, super le soft non smile

Merci mais j'ai une préférence pour le GNU.

Hors ligne

#5 01/08/2019 14:13:10

duple
Membre

Re : Format Export fichier XML

oles67 a écrit :
duple a écrit :

Salut,
Si çà peut aider, existe un logiciel "Navicat" qui permet de se connecter sur plusieurs SGBD, tel que Oracle, PG, Mysql, ... et on peut exécuter des requêtes dedans, on peut également exporter les données sous plusieurs format : le xml y compris. Tu peux même paramétrer çà pour que çà se lance en tache planifiée, super le soft non smile

Merci mais j'ai une préférence pour le GNU.


Ton PG est hébergé dans un environnement Linux, mais tu peux bien aussi avoir un poste client windows dont navicat installé. Sinon, il me semble que Navicat fonctionne sous les environnements Mac, Windows et Linux.

Hors ligne

Pied de page des forums