[C++]Mise en forme de fichier

Salut la zone!

Je vous explique rapidement mon probleme. J’ai un long fichier csv (environ 400 000 lignes B) ) qui au final devra être ouvert avec excel.
Excel comme vous le savez tous est limité à 65536 lignes. Je cherche donc à developper une petite appli qui mettra en forme le fichier de la sorte:

fichier d’origine:

Donnée 1
|
|
Donnée 400 000

fichier modifié:

[codebox]Donnée 1 Donnée 65537 Donnée 131073
| | |
| | |
Donnée 65536 Donnée 131072 Donnée 196608[/codebox]

etc. jusqu’à la fin du fichier

j’ai essayé beaucoup de choses et rien ne marche comme je veux.

Auriez vous une jolie solution pour moi?

merci d’avance

Je n’y connais rien en programmation, mais mon premier reflexe c’est de dire qu’Excel, ce n’est pas fait pour ça.

Tu veux avoir un fichier excel avec 6 colonnes de 65 536 lignes ?

Je ne sais pas ce que tu veux en faire au final, mais le traiter en base de données, ça serait pas plus simple ?

Ya pas de fonctionalités avancée d’import dans excel ? il me semblait.

ce sont des données recupérées par un capteur et stockées sous un fichier csv, pas le choix du format de l’exportation.

Pour ce qui est des fonctionnalités avancés d’import dans excel, j’ai cherché, et le seul truc qui pourrait être interessant (que j’ai trouvé) c’est au niveau de l’exportation des fichiers textes, sauf que c’est limité à 32xxx lignes.

Je cherche à realiser l’appli qui s’occuperait de la mise en page.

bah, tu fais le traitement simplement en lisant toute les lignes en memoire, puis tu reecris le fichier dans le bon format. Je vois pas trop le souci en fait. C’est de la prog de base.

[quote=“xevius, post:4, topic: 46089”]ce sont des données recupérées par un capteur et stockées sous un fichier csv, pas le choix du format de l’exportation.

Pour ce qui est des fonctionnalités avancés d’import dans excel, j’ai cherché, et le seul truc qui pourrait être interessant (que j’ai trouvé) c’est au niveau de l’exportation des fichiers textes, sauf que c’est limité à 32xxx lignes.

Je cherche à realiser l’appli qui s’occuperait de la mise en page.[/quote]
Le mieux serait de faire un script en VB qui lit le fichier source et créer un nouveau fichier du format que tu veux, genre :
v1,v32k,v64k,v128k
v2,v32k+1 …
Ou sinon tu trouves un utilitaire splitter de ton fichier txt (ça existe, c’est ce que j’avais fait dans un cas similaire) et tu importes les différents fichiers dans des fichiers excels séparés, ensuite, tu pourras copier/coller les colones ou tu veux.

sauf que stocker 400 000lignes en mémoire il aime pas

pour le moment j’ai reussi à fractionner mon fichier en plusieurs fichiers de 65536 lignes et j’essaye de les regrouper dans un seul.

Pour ce qui est d’utiliser un programme annexe, il faut limiter au maximum les utilisations de softs annexe pour eviter de compliquer la manoeuvre finale.

je vais voir ce que j’arrive a faire maintenant!

Pourquoi ne pas gérer les feuilles ? genre pour toutes les 65536 lignes tu crées une nouvelle feuille dans ton fichier/classeur Excel. A moins qu’Excel soit vraiment limité à 65536 lignes pour l’intégralité du fichier.

Je ne pense pas que le csv gère les feuilles, et faire du vrai .xls complique légèrement le probleme.

[quote=“xevius, post:7, topic: 46089”]sauf que stocker 400 000lignes en mémoire il aime pas

pour le moment j’ai reussi à fractionner mon fichier en plusieurs fichiers de 65536 lignes et j’essaye de les regrouper dans un seul.

Pour ce qui est d’utiliser un programme annexe, il faut limiter au maximum les utilisations de softs annexe pour eviter de compliquer la manoeuvre finale.[/quote]

Hum, je dirais quand meme que lire ** 65k lignes, les ecrires dans un fichier, faire une nouvelle colonne dans ledit fichier, revenir a **, c’est pas la fin du monde si ?
(ha, et s’emmerder avec C++ pour ca, c’est sortir le marteau pour une punaise (non, je veux pas lancer un enieme debat, mais si tu mets un bout de ton fichier, je pourrais regarder a te coder un truc crado en C# si ca t’interesse). Et si faut limiter les programmes externes au max, regardes ce que tu peux faire en vbs direct dans excel. J’ai deja vu des trucs de furieux, donc, ton souci doit etre jouable direct comme ca.

Enfin, si tu luttes sur un bout de code en particulier, hesites pas a poster, ca sera plus simple pour tout le monde. (a moins que t’ais un NDA sur ce genre de truc B) )

le probleme c’est qu’un fichier .csv, ça fonctionne par lignes et pas par colonnes.
donc ce qu’il faut faire c’est ecrire l’enregistrement 1, puis un point-virgule, puis l’enregistrement 65536, un point-virgule, et jusqu’à avoir un numero d’enregistrement supérieur au nombre de ligne du fichier d’origine, auquel cas on met un retour chariot, puis l’enregistrement 2, puis le 65537, etc…

Euh… 2 cents, à l’arrache là.

Tu as dans ton fichier CSV quelque chose de ce genre, non?

Donnée 1 Donnée 2 Donnée 3 .. Donnée 40000

C’est ça?

Pourquoi tu ne crées pas un soft en C qui te ferait:

Donnée 1, Donnée 2, Donnée 3, Donnée 4, Donnée 5, Donnée 6, Donnée 7 Donnée 8, Donnée 9, Donnée 10, Donnée 11,.. Donnée 399996, Donnée 399997, Donnée 399998, Donnée 399999, Donnée 400000

Tu ajoutes chaque données l’une après l’autre, entre chaque donnée tu ajoutes une virgule (donc nouvelle colonne), et après X données tu ajoutes un ‘\n’ donc une nouvelle ligne.

Ou alors j’ai rien compris au problème.

[quote=“AnA-l, post:10, topic: 46089”]Hum, je dirais quand meme que lire ** 65k lignes, les ecrires dans un fichier, faire une nouvelle colonne dans ledit fichier, revenir a **, c’est pas la fin du monde si ?
(ha, et s’emmerder avec C++ pour ca, c’est sortir le marteau pour une punaise (non, je veux pas lancer un enieme debat, mais si tu mets un bout de ton fichier, je pourrais regarder a te coder un truc crado en C# si ca t’interesse). Et si faut limiter les programmes externes au max, regardes ce que tu peux faire en vbs direct dans excel. J’ai deja vu des trucs de furieux, donc, ton souci doit etre jouable direct comme ca.

Enfin, si tu luttes sur un bout de code en particulier, hesites pas a poster, ca sera plus simple pour tout le monde. (a moins que t’ais un NDA sur ce genre de truc B) )[/quote]

Comme l’a dit Rabban ce n’est pas si simple ^^ et C++ c’est tout simplement parce que faire cette modif avec une macro excel est impossible (ou presque) et que pour le reste de mon boulot je bosse en C++

[quote=“Rabban, post:11, topic: 46089”]le probleme c’est qu’un fichier .csv, ça fonctionne par lignes et pas par colonnes.
donc ce qu’il faut faire c’est ecrire l’enregistrement 1, puis un point-virgule, puis l’enregistrement 65536, un point-virgule, et jusqu’à avoir un numero d’enregistrement supérieur au nombre de ligne du fichier d’origine, auquel cas on met un retour chariot, puis l’enregistrement 2, puis le 65537, etc…[/quote]

j’avais pensé faire un truc du genre mais il faudrait pouvoir lire la n-ème ligne à chaque fois et il faudrait que le fichier soit “symétrique” dans le sens ou il faudrait x * 65536 lignes pour que ca marche bien.

là pour résoudre mon problème j’ai codé un truc bien crade mais pas trop lent et qui fonctionne. Pour une appli qui fonctionnera pas très souvent ça ira!

Pour expliquer ce que j’ai fait (ou pour continuer mon explication en fait) j’ai ouvert le fichier et je l’ai fractionné en plusieurs fichiers de 65536 lignes.
Après j’ouvre ces fichiers et je les regroupe en 1 seul fichier avec les virgules qui vont bien etc.
Après j’approfondirais mes recherches pour optimiser et corriger par un truc plus propre (Vu ce que j’ai fait, ca va pas être dur lol)

En tout cas, merci pour votre aide.

[quote=“rolyat, post:12, topic: 46089”]Euh… 2 cents, à l’arrache là.

Tu as dans ton fichier CSV quelque chose de ce genre, non?

Donnée 1 Donnée 2 Donnée 3 .. Donnée 40000

C’est ça?

Pourquoi tu ne crées pas un soft en C qui te ferait:

Donnée 1, Donnée 2, Donnée 3, Donnée 4, Donnée 5, Donnée 6, Donnée 7 Donnée 8, Donnée 9, Donnée 10, Donnée 11,.. Donnée 399996, Donnée 399997, Donnée 399998, Donnée 399999, Donnée 400000

Tu ajoutes chaque données l’une après l’autre, entre chaque donnée tu ajoutes une virgule (donc nouvelle colonne), et après X données tu ajoutes un ‘\n’ donc une nouvelle ligne.

Ou alors j’ai rien compris au problème.[/quote]

Si je pouvais faire ça ce serait plus simple!

Les données sont “chronologiques” et je dois obligatoirement les mettre en colonne B)

pas forcément. si on ajoute 65536 à chaque fois et qu’on change de ligne dès qu’on dépasse le nombre de lignes d’origine, ça fonctionne.
si on prend un fichier de 7 lignes a mettre dans 5:
on commence pas 1. 1+5=6. 6+5=11, on retourne à la première colonne et on met 2.
2+5=7. 7+5=12, ça dépasse.
3+5 = 8, ça dépasse
4+5 = 9, ça dépasse
5+5 = 10, ça dépasse.

on obtient bien:
1 6
2 7
3
4
5

par contre effectivement, il faut systématiquement sauter tout un tas de lignes, et si les data n’ont pas éxactement la même taille ça signifie une lecture séquentielle absolument pas optimisée, puisqu’il faudra parcourir 65536 fois le fichier.

ben c’est tout con, tu créés ton fichier sequenciel comme a dit Rabban :

1;2;3;4;5; ....; 65535 65536;65537; ...;131 070; ...

Puis tu ouvres ton fichier sous excel, tu selectionnes toutes tes lignes, tu les copies, et tu les colles dans une autre feuille via le menu “collage special” en cochant “transposer”.
Les lignes deviennent alors les colonnes et réciproquement.
et voila !

Ben,
RTFM … (F1 sous excel, recherche inverser ligne colonne, resultat en 3s B) )

UltraEdit a une fonctionnalité du genre Convert to Fixed Column.
Tu définis ton séparateur et tu cliques sur Scan.
Là il calcule la largeur nécessaire pour chaque colonne (tu peux augmenter les valeurs pour plus de lisibilité).
Ensuite Convert et il met en forme le fichier en rajoutant des espaces pour que chaque colonne soit bien alignée.

D’après mon expérience ça marche assez bien, et UltraEdit est à priori capable de gérer de très gros fichiers sans trop de problème. A essayer donc ! B)

EDIT : Désolé, après relecture je crois que je suis un peu hors-sujet…

Ha, ben va falloir reprendre les cours alors B)

Je viens de tester la vite fait (bon, c’est du C#, donc ca va surement plus vite a developper), mais le loading de 400 000 x 25 caracteres ne pose aucun souci, et que la réécriture en colonne comme tu le veux hormis le fait d’etre lente, n’en pose pas plus. Apres, l’algo, ca doit ressembler a ca (une fois que tu a chargé les données dans une liste de 400k items). Attention, c’est pas forcement correct, ni forcement optimal (probablement pas optimal du tout, mais je viens de mettre plus de temps a taper ce post que le code).

[code]FileStream f = File.Open(« newfile.txt », FileMode.Create, FileAccess.ReadWrite);

StreamWriter w = new StreamWriter(f);

while (l.Count != 0)
{
int i = 0;

while (i < l.Count)
{
	w.Write(l[i] + ";");
	l.RemoveAt(i);
	i += 65365;
}

w.WriteLine();

}

w.Flush();
f.Close();[/code]

C’est quoi le probleme avec importer le CSV dans une base de donnee? Meme Access est parfait pour ca parceque c’est fait pour ca une base de donnee, pas Excel. Mais vraiment pas B).

Bah oui, mais apparement, le monsieur a des contraintes qui doivent etre dictés par ses superieur. Apres, il est effectivement mieux de faire avec une bdd, mais bon, meme sans ca, ca devrait pas poser de souci, c’est juste de la tranformation basique de données.