Importer un tableau excel [Résolu]

manuweb_21 15 Messages postés mardi 10 octobre 2006Date d'inscription 20 octobre 2006 Dernière intervention - 17 oct. 2006 à 18:21 - Dernière réponse : manuweb_21 15 Messages postés mardi 10 octobre 2006Date d'inscription 20 octobre 2006 Dernière intervention
- 20 oct. 2006 à 09:49
J'ai un fichier qui s'appelle: "conversiontable.txt" qui contient un tableau exporté de excel (:-> séparations = tabulations) il a cette forme:

Argon Ar 1.784 0.125
Arsine AsH3 3.524 0.133
Butane C4H10 2.705 0.457
...

J'aimerais enregistrer ces données dans des objects dont voici la classe:

public class GasTable
{ public string name;
public string symbol;
public double rho;
public double cp; }

Après avoir lu pas mal de pages dans un manuel, j'ai une certaine idée de ce que je veux faire, malheureusement par mon manque d'expérience en c#, je s'ais pas comment le traduire "informatiquement":
je voudrais: créer un StreamReader qui enregistre chaque ligne dans un string.
Ensuite diviser cette chaine à l'aide de Split(avec le caractère Tabulation comme diviseur).
Convertir les morceaux obtenu en double (pour rho et cp).
Assigner toutes les valeurs obtenues à un array gas[] de classe GasTable
Vous pouvez me montrer comment on fait ça?
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 19 oct. 2006 à 09:10
3
Merci
Hello,

Voici un exemple :

FileStream

fs = File.OpenRead("YourFilePath");
StreamReader sr = newStreamReader(fs);

string line = sr.ReadLine();

List<GasTable> gas = newList<GasTable>();

while (line != null)

{
string[] splitted = line.Split(newchar[] { '\t' });

object gasLine = newobject();

gasLine.name = splitted[0];
gasLine.symbol = splitted[1];
gasLine.rho = Convert.ToDouble(splitted[2]);
gasLine.cp = Convert.ToDouble(splitted[3]);
gas.Add(gasLine);
}
sr.Close();
fs.Close();

A la place d'un tableau de GasLine, je t'ai mis une List. C'est plus pratique. Si tu n'as pas le .net 2.0, utilise une Arraylist à la place. 

Amicalement, SharpMao

Merci SharpMao 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de SharpMao
Meilleure réponse
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 20 oct. 2006 à 08:12
3
Merci
Oups,

c'est de ma faute.
Dans un premier temps, pour qu'il ne me mette pas trop d'erreur, j'ai mis des objet à la place des GasTable.
Il faut donc remplacer cette ligne par

GasTable gasLine = new GasTable();

Pour la version, si tu travailles pour une école et qu'il t'on fourni le VS, je ne peux pas faire grand chose. Par contre, si tu travailles pour toi, tu peux télécharger gratuitement le Visual C# Express, qui ne travaille qu'avec du C#, mais devrait être largement suffisant pour ce que tu essaie de faire.

Un petit conseil, évite de nommer une variable GasTable si tu utilise une classe GasTable. Ta variable peut s'appeler GasList, et ton code gagnera en lisibilité.

La différence entre la List que j'avais proposée et l'ArrayList, tiens dans le fait que la 1ère est générique, on peut donc indiquer le types des éléments contenus (GasTable). La seconde contient n'importe quel objet, qu'il faudra typecaster à la sortie.
GasTable g = (GasTable)GasList[0];

Amicalement, SharpMao

Merci SharpMao 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de SharpMao
manuweb_21 15 Messages postés mardi 10 octobre 2006Date d'inscription 20 octobre 2006 Dernière intervention - 19 oct. 2006 à 18:29
0
Merci
Merci pour la réponse. Au fait comme personne me répondait j'ai finalement réussi a le faire mais justement en utilisant un tableau, mais comme tu le dis c'est pas trop pratique et pas tres élégant. J'ai essayé avec ta List. Malheureusement je dois pas avoir la bonne version. J'ai utilisé ArrayList, mais je comprends pas pourquoi ça marche pas: j'ai ce message:" 'object' does not contain a definition for symbol, cp, ..."
I doit y avoir un problème dans la reconnaissance de la classe, je sais pas???

using System;
using System.IO;
using System.Collections;

namespace ConsoleApplication1
{
    class Class1
    {
        static void Main(string[] args)
        {
            FileStream fs = File.OpenRead("Konversionstabelle.txt");
            StreamReader sr = new StreamReader(fs);
            string line = sr.ReadLine();
            ArrayList GasTable = new ArrayList();
                while (line != null)
                {
                    string[] splitted = line.Split(new char[] { '\t' });
                    object gasLine = new object();
                    gasLine.name = splitted[0];
                    gasLine.symbol = splitted[1];
                    gasLine.rho = Convert.ToDouble(splitted[2]);
                    gasLine.cp = Convert.ToDouble(splitted[3]);
                    GasTable.Add(gasLine);
                }
            sr.Close();
            fs.Close();
        }
 public class GasTable
        {    
            public string name;
            public string symbol;
            public double rho;
            public double cp;
        }
    }
}
Commenter la réponse de manuweb_21
manuweb_21 15 Messages postés mardi 10 octobre 2006Date d'inscription 20 octobre 2006 Dernière intervention - 20 oct. 2006 à 09:49
0
Merci
Merci beaucoup pour tes conseils. Maintenant ça marche nikel et cette Arraylist est bien plus approprié que mon tableau. Y avait juste encore une petite erreur.
Le Readline, i faut qu'i soit dans la boucle, sinon i peut pas y avoir d'incrémentation et la boucle reste bloquée sur le premier élément jusqu'a l'infini . Je l'ai remplacée par:

while(true)
{
       string line = sr.ReadLine();

        if (line == null)
                {
                    break;
                }
       .............
      .............
}
Commenter la réponse de manuweb_21

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.