Menu

Copier coller une colonne excel d'un fichier a un autre [Résolu]

Messages postés
253
Date d'inscription
mardi 24 février 2015
Dernière intervention
4 janvier 2019
-
Bonjour,

je désire copier une colonne entière d'une fichier.csv (excel) qui en contient pas mal, pour la collé dans un autre fichier.csv qui lui est vierge.

le tout en c# bien entendue.

actuellement je suis en mesure de crée mon nouveau fichier.csv mais pas encore de le remplir.
ceci est un Edit de mon premier post car j'ai finalement trouver certaines choses intéressante grâce a mon pote Google.
tel que ce liens : https://www.softfluent.fr/blog/expertise/Creation-d-un-parseur-csv
ou encore celui ci : https://joshclose.github.io/CsvHelper/ (je le comprend moins bien)
je vais voir ce que je suis en mesure de réussir grâce a cela .

cependant si certain d'entre vous on des solutions miracle ou des incantations pour m'aider je reste a l'écoute .
merci bien .

Configuration: Windows / Chrome 71.0.3578.98
Afficher la suite 

Votre réponse

5 réponses

Messages postés
12548
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 janvier 2019
754
0
Merci
Bonjour

Un fichier csv n’est pas un fichier excel, le format existant avant excel.
D’ailleurs à l’époque, il n’y avait que la virgule comme séparateur, le point virgule a été introduit ensuite.


Puisque tu veux juste extraire une colonne pour la mettre dans un fichier vierge, pas la peine d’crire un parser complet.

Je te montres de tête ( y a p’tet une faute de frappre par ci par là),
On va dire que tu veux la 3eme colonne (index 2)
IEnnumerable<string> colonne;
colonne = (from l in File.ReadAllLines(“fichierSource.csv”)
                    let valeurs = l.Split(“;”)
                    select valeurs[2]);
File.WriteAllLines(“fichierCible.csv”);



Quand j'étais petit, la mer Morte n'était que malade.
George Burns
astrocurieux
Messages postés
253
Date d'inscription
mardi 24 février 2015
Dernière intervention
4 janvier 2019
3 -
merci de ton intervention Whismeril.
j'essai de comprendre ton morceau de code ...

je débute en c# donc pas mal de chose m’échappe encore.
que signifie le 1 que l'on retrouve 2 fois ?
Commenter la réponse de Whismeril
Messages postés
253
Date d'inscription
mardi 24 février 2015
Dernière intervention
4 janvier 2019
3
0
Merci
Suite a mes recherche et au quelque indices que Whismeril ma laissé j'ai trouver une fonction assez simple a comprendre et vendu comme fonctionnant bien .

je rend a César ce qui appartient a César : https://code.i-harness.com/fr/q/509cb7

le code en lui même (adapter a mon code) :
 private void coloneExtract(object sender, EventArgs e)
        {
            var columnTarget = new List<string>();

            using (var rd = new StreamReader(Globals.TARGETPATH))
            {
                while (!rd.EndOfStream)
                {
                    var splits = rd.ReadLine().Split(';');
                    columnTarget.Add(splits['1']);
                }
            }

            foreach (var element in columnTarget)
                Console.WriteLine(element);
        }


ça a l'air de bien fonctionner chez les autres mais évidement pas chez moi .... (enfin presque)
ça fonctionne uniquement quand :
columnTarget.Add(splits['0']);

quand je remplace le 0 par autre-chose ça plante avec l'erreur suivante :
System.IndexOutOfRangeException : 'L'index se trouve en dehors des limites du tableau.'

c'est explicite et pourtant je trouve pas comment arranger çà ...
mon fichier et assez imposant mais même avec un petit je reste sur la même erreur
Commenter la réponse de astrocurieux
Messages postés
12548
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 janvier 2019
754
0
Merci
Bon si tu trouves ce code plus simple, admettons.

S'il n'y a pas d'index 1, ça veut dire qu'il n'y a pas de texte après le ';'.

En gros si tu as ce type de texte
"toto;titi;tata"


"toto;titi;tata".Split(';')
va retourner une collection dont les 3 items sont
  • toto
  • titi
  • tata


Maintenant si le texte est
"toto,titi     tata"
, il n'y a pas de ; donc le split va retourner une collection, avec un seul élément qui est
"toto,titi     tata"
, et pas d'index 1.

Pour cette question,
que signifie le 1 que l'on retrouve 2 fois ?
c'est n'est pas un 1 c'est un L minuscule, j'aurais pu prendre ligne ou x ou patate, c'est une variable.

Quand à
je débute en c# donc pas mal de chose m’échappe encore.
, débuté n'est pas un problème, on y est tous passé, par contre mettre la charrue avant les boeufs, ce que font presque tous les autodidactes (moi y compris à l'époque) est une erreur.

Là c'est du très simple et tu ne le comprends pas, parce que tu n'as pas acquis les bases.
Alors tu peux y arriver plus ou bien, plus ou moins efficacement (efficacité de codage, efficacité d'exécution etc...) et puis un jour ça va bloquer.

Le meilleur conseil que je puisse te donner est de mettre ton projet de coté quelques jours (entre 5 et 10 en moyenne), afin de suivre ce cours qui aborde toutes les bases.
http://tahe.developpez.com/dotnet/csharp/
Il ne fera pas de toi un codeur hors pair, mais il te donnera un socle de connaissance solide pour bien apprendre par la suite.

astrocurieux
Messages postés
253
Date d'inscription
mardi 24 février 2015
Dernière intervention
4 janvier 2019
3 -
j’apprécie ton aide Whismeril.

malheureusement je n'est pas tout ce temps devant moi pour développer le programme que l'on me demande.
j'apprend donc au fur et a mesure. le C# étant assez différent du C ou encore du Cpp avec lesquels je dev depuis maintenant 4 ans. je comprend que ce genre de question peut paraître futile ceci dit.

j'ai finalement trouver comment faire de mon coté, un peu également grâce a toi et ton premier exemple .
je dépose ma solution sous peu.

merci et bonne soirée
Commenter la réponse de Whismeril
Messages postés
253
Date d'inscription
mardi 24 février 2015
Dernière intervention
4 janvier 2019
3
0
Merci
voici comment j'ai résolut mon problème .

mon fichier.csv comprend de nombreuses lignes vide dans la colonne ciblé et c'est en partie pour ca que j'etait bloqué.

voici le bout de code :

private void colonneExtract(object sender, EventArgs e)
        {
            File.WriteAllText(Globals.NEWFILEPATH, string.Join(";\n", File.ReadAllLines(Globals.TARGETFILEPATH).Skip(1).Where(x => x.Split(';').Length > Globals.NUMCOLONNETARGET).Select(x => x.Split(';')[Globals.NUMCOLONNETARGET])));
        }


voila tout.
merci de votre aide.
Commenter la réponse de astrocurieux
Messages postés
12548
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 janvier 2019
754
0
Merci
Oui c'est très différent de C et C++, cela dit un split reste un split.

La question n'est pas futile, cela dit apprendre les bases reste la meilleure chose à faire quelque soit a discipline.

Puisque tu codes déjà en C et C++, et si en C++ tu codes objet, tu pourrais suivre le cours en 2 ou 3 jours.
Mais bon si t'as pas le temps.

Je me permet une remarque sur ta solution.
Tu as utilisé un WriteAllText, et fais un join de ";\n".
Puisque tu as une collection, WriteAllLine insère automatique "\r\n", si tu dois travailler sous windows c'est mieux.
Le fait de mettre un ; en fin de ligne crée une colonne vide, c'est voulu?
astrocurieux
Messages postés
253
Date d'inscription
mardi 24 février 2015
Dernière intervention
4 janvier 2019
3 -
ce n'est pas l'envie d'apprendre qui manque. j'aime plutôt bien ça le c# mais je doit dev un petit logiciel pour une entreprise chez qui je suis en alternance 2j/semaine donc pas masse de temps pour me lancer sur des leçons. mais je progresse de plus en plus actuellement .

j'arrive a me débrouiller sans trop de difficulté, sauf quand ça deviens technique .
merci de ta remarque, je test cette modification asap.
Commenter la réponse de Whismeril