Importer un tableau excel

Résolu
manuweb_21 Messages postés 15 Date d'inscription mardi 10 octobre 2006 Statut Membre Dernière intervention 20 octobre 2006 - 17 oct. 2006 à 18:21
manuweb_21 Messages postés 15 Date d'inscription mardi 10 octobre 2006 Statut Membre Dernière intervention 20 octobre 2006 - 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?

4 réponses

SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
19 oct. 2006 à 09:10
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
3
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
20 oct. 2006 à 08:12
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
3
manuweb_21 Messages postés 15 Date d'inscription mardi 10 octobre 2006 Statut Membre Dernière intervention 20 octobre 2006
19 oct. 2006 à 18:29
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;
        }
    }
}
0
manuweb_21 Messages postés 15 Date d'inscription mardi 10 octobre 2006 Statut Membre Dernière intervention 20 octobre 2006
20 oct. 2006 à 09:49
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;
                }
       .............
      .............
}
0
Rejoignez-nous