Exporter en csv une matrice stockée en base

Exporter en csv une matrice stockée en base - SQL/NoSQL - Programmation

Marsh Posté le 10-12-2009 à 14:32:04    

Bonjour,
J'ai une matrice stockée dans une table MySQL, dont la structure est composée de 3 champs : ligne, colonne, valeur. Cette table peut être très volumineuse (plusieurs millions de lignes). J'ai besoin d'exporter au format csv cette matrice mais pas en utilisant la façon "classique" de l'export proposé par MySQL (une ligne dans la table = une ligne dans le csv avec des ; entre chaque champ) mais en gardant uniquement le champ "valeur", la position de celui-ci dans le csv reflétant la valeur des 2 autres champs ligne et colonne.
Ex : ma table Matrice contient les lignes suivantes (2 lignes x 3 colonnes) :

Code :
  1. Ligne Colonne Valeur
  2. 0      0          1
  3. 0      1          2
  4. 0      2          3
  5. 1      0          4
  6. 1      1          5
  7. 1      2          6


 
Je voudrais en sortie, dans mon csv :

Code :
  1. 1;2;3\n
  2. 4;5;6\n


 
1ière idée : je concatène les valeurs d'une même ligne dans un seul champ avec le séparateur ;. Pb : comment je fait ça en SQL?
2ième idée : je génère autant de requête qu'il y a de lignes qui vont alimenter par ajout successif un csv.Pb : comment je fait ça en SQL?
autre idée?
 
Merci :)


Message édité par rufo le 10-12-2009 à 15:05:51

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 10-12-2009 à 14:32:04   

Reply

Marsh Posté le 10-12-2009 à 15:00:32    

j'arrive pas à comprendre comment tu passes de ta matrice à ton csv  
 
mais, pour moi, l'export doit exporter les données calculées, donc tu devras surement passer par une table temporaire pour y construire tes données avant export

Reply

Marsh Posté le 10-12-2009 à 15:03:43    

bon, j'ai trouvé, la bonne solution est :

Code :
  1. SELECT GROUP_CONCAT(Valeur ORDER BY Colonne SEPARATOR ';') FROM Matrice GROUP BY Ligne ORDER BY Ligne INTO OUTFILE 'c:/Matrice.csv' LINES TERMINATED BY '\n';


;)
 
Par contre, si le fichier existe déjà, la requête plante :( Une idée de comment forcer la création du fichier? Merci.


Message édité par rufo le 10-12-2009 à 15:08:48

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 10-12-2009 à 15:07:11    

rocodido a écrit :

j'arrive pas à comprendre comment tu passes de ta matrice à ton csv  
 
mais, pour moi, l'export doit exporter les données calculées, donc tu devras surement passer par une table temporaire pour y construire tes données avant export


 
les 2 première colonnes dans ma table représentent la position de chaque Valeur dans la matrice (la ligne et la colonne, de 0 à n). C'est plus clair? Donc y'a rien à calculer.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 10-12-2009 à 15:11:58    

ok j'ai saisi :)

 

Manque une parenthèse dans ta requête.

 

Je connais mal la syntaxe mysql, mais si te requête plante , appelle la depuis un batch qui fera un delete du fichier avant de le créer et remplir

 


Je rajouterais aussi colonne dans ton order


Message édité par rocodido le 10-12-2009 à 15:16:07
Reply

Marsh Posté le 10-12-2009 à 15:36:35    

je fais du php, donc c'est comme ça que j'ai résolu la suppression du fichier. Je pensais qu'il y avait une option pour forcer la création.
 
Par contre, j'ai un pb, cette syntaxe marche mais sur une matrice de 4610x3035, il me sort un fichier csv de 4610x119 :( Je me demande si y'a pas des variables de paramétrage limitant la taille du fichier en sortie ou la taille du buffer qui fait le group_concat ou autre... :/ mais j'ai pas trouvé pour l'instant...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 10-12-2009 à 15:58:42    

L'exemple meme d'une usina a gaz SQL qui se fait en 3mn chrono avec n'importe quel langage qui sait se connecter a une base mySQL.

Reply

Marsh Posté le 10-12-2009 à 16:07:45    

ben en php, c'est pas 3 min chrono qu'il faut. Comme j'ai besoin d'avoir 2 fichiers csv (la matrice telle quelle et sa transposée). Assez bizarrement, la création du premier csv met plus de 2h (ça fait un fichier de 144 Mo) alors que le suivant met 20 mins (doit y avoir une histoire de cache qq part, mais ça ne vient pas de mon script). Comme j'ai besoin que ça soit cross-platform, en exe en C, c'est pas super pratique.
 
Là, je veux juste comprendre pourquoi group_concat tronque les données.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 10-12-2009 à 16:12:00    

Bon, ça vient de la variable group_concat_max_len. Elle est positionnée à 1024. J'ai plus qu'à trouver comment enlever cette limitation et avoir une valeur illimitée (ou suffisamment grande).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 10-12-2009 à 16:39:28    

Bon, ben j'ai fini par trouver et arriver à ce que je veux grâce à ce site : http://www.mysqlperformanceblog.co [...] extension/

Citation :


The result is truncated to the maximum length that is given by the group_concat_max_len system variable, which has a default value of 1024. The value can be set higher, although the effective maximum length of the return value is constrained by the value of max_allowed_packet. The syntax to change the value of group_concat_max_len at runtime is as follows, where val is an unsigned integer:
 
SET [GLOBAL | SESSION] group_concat_max_len = val;
 
Current values in Our server
 
max_allowed_packet = 67107840
group_concat_max_len = 1024


 
J'ai mis group_concat_max_len à 1000000 et ça marche. Je passe de 2h à 3 mins pour mon premier csv et de 20 mins à 3 mins pour mon 2ième. Donc youpi, ça marche :)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 10-12-2009 à 16:39:28   

Reply

Marsh Posté le 10-12-2009 à 17:06:24    

\o/

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed