Recuperer des donnees ds un .txt debutante C#

Fermé
Cynthia 22 Messages postés 6 Date d'inscription mercredi 2 juillet 2008 Statut Membre Dernière intervention 24 juin 2009 - 22 juil. 2008 à 09:20
 Rminator - 26 mai 2011 à 12:18
Bonjour,
je dois realiser un programme en C#. Mon probleme majeure est que je n'en ai absolument jamais fait.

L'objectif de mon programme est de recuperer certaines donnees presentes dans un fichier text, et ensuite de tracer une representation graphique de ces donnees.

Je travaille avec Microsoft Visual Studio 2008.

Mon fichier text est de cette forme


Data file. 1:11 AM Tuesday, Jully 22, 2008
Filename: C:\\Data\Projects\blabla.txt
Format: All
Cols: orientation x y z hb hc hd 12 13 14 oto form bf1 bf2 bf3 sum source mSec
Medium: Conductivity: 0.12 Density: 1000 Permittivity: 1 MediumCalFactor: 1

-------------------------------------------------------------------------------------------------
orient x y z hb hc hd 12 13 14 oto form sum source mSec
1 60 90 -100 316 321 130 768 36 32 30 767 0.57 aff 0
2 61 90 -105 313 320 143 776 33 32 43 776 0.57 aff 13
3 62 90 -110 318 323 142 784 38 32 42 783 0.58 aff 72
4 63 90 -115 315 327 141 783 35 32 41 783 0.58 aff 39
5 64 90 -120 325 330 149 804 35 33 49 804 0.59 aff 66
1 65 90 -125 320 331 152 802 30 33 52 803 0.59 aff 659
2 66 90 -130 328 331 156 815 38 31 56 815 0.6 aff 22
3 67 90 -135 337 333 182 852 37 33 82 852 0.63 aff 92
4 68 90 -140 350 344 197 891 30 34 97 891 0.66 aff 688
5 69 90 -145 349 346 185 880 39 36 85 880 0.65 aff 1209
1 70 90 -150 367 349 231 947 37 39 31 947 0.7 aff 422
2 71 90 -155 382 351 245 978 32 31 45 978 0.72 aff 147

...


j'arrive a lire le fichier (Ne rigolez pas, c'est un debut pour moi).
Maintenant je souhaiterai avoir acces aux 2ieme, 3ieme, 4ieme collones et rentrer les donnees de ces colonnes dans un tableau pour ensuite effectuer un trace en 3 dimensions.

Voila ce que j'ai ecrit pour lire les donnees:

using System.IO;

namespace ConsoleApplication1
{



class Program
{
static void Main(string[] args)
{

String line;


try

{

StreamReader sr = new StreamReader("C:\\Experimentlambda.txt");

//Read the first line of text

line = sr.ReadLine();

//Console.WriteLine("The size of short is {0}.", sizeof(ConsoleApplication1));


//Continue to read until you reach end of file

while (line != null)

{

//write the lie to console window

Console.WriteLine(line);

//Read the next line

line = sr.ReadLine();

}

//close the file
sr.Close();

Console.ReadLine();
}

finally
{
Console.WriteLine("Ouf sa marche");
}
}
}
}


Merci de me mettre sur la voix.

A bientot j'espere!!!

PS: Desole pour les accents, clavier QWERTY oblige...

7 réponses

mich62120 Messages postés 631 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 janvier 2010 6
22 juil. 2008 à 10:24
Salut,

Sans être sur je dirai que tu as la possibilité lorsque tu lis les lignes avec tes valeurs de les transformer en tableau avec le fonction nomdetastring.split(" ");

tu fais string[] stab=nomdetastring.split(" "); ou un truc du style je sais plus précisément;
et ta string est découpée en mot a chaque " " .

Tu pourras ensuite traité mot par mot (ou valeur par valeur)
Si tu veux réecrire dans ton fichier texte ensuite il faut reconcaténer ton tableau dans un boucle.

Cela devrai marcher mais je ne sais pas si c'est le plus simple.

Mich
0
Cynthia 22 Messages postés 6 Date d'inscription mercredi 2 juillet 2008 Statut Membre Dernière intervention 24 juin 2009
24 juil. 2008 à 07:46
Yep, merci Mich, la fonction Split marche.


Mais ce que je souhaiterai, c'est placer les valeurs dans un tableau dont la taille est (nombre de ligne, nombre de colonne) et ca, je ne sait pas comment faire.
Donc si tu passes par la, n'hesite pas a me donner un ptit coup de main
0
mich62120 Messages postés 631 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 janvier 2010 6
24 juil. 2008 à 09:48
Salut Cynthia,

je pense que tu dois suivre cet algo:

1/se placer au début des données

2/lire les lignes jusqu'à la fin dans une boucle do{}while ce qui permettera de savoir ton nombre de lignes avec nomdutableau1.lenght() (je crois que c'est ça mais à vérifier).

3/prendre une ligne et la découper avec split(" ") pour avoir un tableau. ainsi tu connaîtra le nombre de colonnes de la même manière.

4/ensuite créé et remplir le tableau

//se placer au début

int nbreligne=-1;
int nbrecol;


 do
                {    //boucle pour regarder combien de ligne

                   string temp = fluxLecture.ReadLine();  //lecture d'une ligne 
                    nbreligne++;

                } while (temp != null);

string[] nomdutableau1=new string[nbreligne];

//se replacer au début des données

for(int i=0;i<nbreligne;i++)
    nomdutableau1[i]=fluxLecture.ReadLine();

//regarder le nombre de colonnes     **
nbrecol=(nomdutableau1.split(" ")).lenght();


do{

string[][] donnée=new string[nbreligne][nbredecol];

for( i=0;i<nbreligne;i++){
      
       string[] temp=nomdutableau1.split(" "); //découpe le tableau contenant les lignes pour délimiter les colonnes
             
       for(int j=0;j<nbrecol;j++){
       
                donnée[i][j]=temp[j];  //remplit les colonnes du  tableau final a la ligne découper
        }
}


**Attention cela marche que si les lignes ont autant de colonnes sinon il faut les faire une par une et prendre le nombre le plus grand.


Ce code n'est ni optimisé ni expliqué ni testé mais je n'ai pas trop le temps en début de journée.
je suis désolé, je te recontacterai quand je serai revenu pour savoir si cela marche ou si tu a besoin d'explication.

Mich



PS: T'es vraiment en Australie?
0
Cynthia 22 Messages postés 6 Date d'inscription mercredi 2 juillet 2008 Statut Membre Dernière intervention 24 juin 2009
24 juil. 2008 à 10:51
Salut,
je te remercie pour ce que tu as fait.

J'ai eu le temps de tester le programme vite fait. Il a l'air de marcher jusqu'au moment ou j'utilise les Split.
A partir de la, le compilateur me sort cette erreur:

'System Array' does not contain a definition for'Split'.

Je regarderai cela de plus pres demain; je m'y suis pas trop interressee.

Oui, je suis bien en Australie. Ici, il est quasi 7h PM donc je dois quitter le travail.

Bonne journee
A bientot

Cynthia
0
mich62120 Messages postés 631 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 janvier 2010 6
24 juil. 2008 à 11:43
Bah il y en a qui ont de la chance je sais pas ce que je donnerai pour être à ta place!!!Je rêve d'aller dans ce pays depuis des années!!!
Moi je suis à Calais c'est pour te dire la différence.



Sinon il faut mettre: nomdutableau[i].split(" ");

car nomdutableau est l'adresse du premier élément du tableau de string alors que nomdutableau[i] est un élément donc une string, donc "splitable" si je puis dire :) .

Moi ici il est l'heure d'aller manger donc j'y vais.
N'hésite pas si tu as encore un problème, je t'aiderai si le temps me le permet.

Bonne soirée, à demain peu être.

Mich
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci pour les conseils, cela m'a bien fait avancer.

La je suis bloquee sur un autre point (peut etre que tu connais la solution).

J'ai un tableau de float et je souhaiterai le convertir en float pour utiliser une fonction.
Sais tu comment y arriver?

Voici une partie de mon code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;


namespace test1
{
public partial class Form1 : Form
{


public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
dplot.DPlot_FindDPLOTLIB();
dplot.DPlot_SetErrorMethod((2));
}
private void button1_Click(object sender, EventArgs e)
{

StreamReader sr = new StreamReader("C:\\Experiment26062008.txt");
StreamReader sp = new StreamReader("C:\\Experiment26062008.txt");
string line = sr.ReadLine();
//se placer au début

int nbline = 0;
int nbraw = 18;
int header = 11;

do
{ //boucle pour regarder combien de ligne



line = sr.ReadLine(); //lecture d'une ligne
nbline = nbline + 1;
//Console.WriteLine(line);



} while (line != null);
// Console.WriteLine(nbline);
int nbusefullines = nbline - header;
//Console.WriteLine(nbusefullines);
//do{
string[] nomdutableau1 = new string[nbline];
// string[] nomdutableau2 = new string[nbline];
string[,] data = new string[nbline - header, nbraw];

// while ((line) != null)

do
{

for (int h = 0; h < nbline; h++)
{
nomdutableau1[h] = sp.ReadLine();
//Console.WriteLine(nomdutableau1[i]);
}

for (int h = 0; h < nbline - header; h++)
{

nomdutableau1[h] = nomdutableau1[h + header];
// Console.WriteLine(nomdutableau1[i]);

}

for (int h = 0; h < nbline - header; h++)
{

string[] MyStringArray = nomdutableau1[h].Split(' ');
//Console.WriteLine(MyStringArray[12]);
for (int l = 0; l < nbraw; l++)
{
data[h, l] = MyStringArray[l]; //fill the raws

}
}

} while ((line) != null);
float[] abscisse = new float[nbusefullines];
for (int h = 0; h < nbusefullines; h++)
{
abscisse(h) = float.Parse(data[h, 2]);
// Console.WriteLine(abscisse[i]);
}
float[] ordonnee = new float[nbusefullines];
for (int h = 0; h < nbusefullines; h++)
{
ordonnee[h] = float.Parse(data[h, 3]);
// Console.WriteLine(ordonnee[i]);
}
float[] hauteur = new float[nbusefullines];
for (int h = 0; h < nbusefullines; h++)
{
hauteur[h] = float.Parse(data[h, 4]);
// Console.WriteLine(hauteur[i]);
}


// Console.WriteLine(data[923,17]);

//close the file
sr.Close();

dplot.DPLOT dp = new dplot.DPLOT();
dp.Initialize();
dp.Version = dplot.DPLOT_DDE_VERSION;
dp.DataFormat = dplot.DATA_3D;



dp.XAxis = "x";
dp.YAxis = "y";

DocNum = dplot.DPlot_Plot8(ref dp,ref abscisse,ref ordonnee, "[DocMaximize()][FilePrint()]"); }


Donc voila, pour utiliser la fonction DPlit_Plot8, il faut que abscisse et ordonnee soient des float.
Aurai tu des conseils a me donner??

Merci d'avance

A bientot

Cynthia
0
mich62120 Messages postés 631 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 janvier 2010 6
31 juil. 2008 à 11:08
A première vue je peux te dire qu'il faut mettre -1 au début du calcul de sommet car si il est vide tu parcoures quand me^me une fois la boucle donc: -1+1=0 //vide

int nbline = -1;
int nbraw = 18;
int header = 11;

do
{ //boucle pour regarder combien de ligne



line = sr.ReadLine(); //lecture d'une ligne
nbline = nbline + 1;
//Console.WriteLine(line);



} while (line != null);

Pour le reste je vais regarder cet après midi la je vais devoir partir à un rendez-vous.

A+ Mich
0
mich62120 Messages postés 631 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 janvier 2010 6
31 juil. 2008 à 14:00
Re,

J'ai regardé et il me semble bizarre que tu ne mette jamais à jour le nombre de colonnes.

c'est un truc du genre:
for (int h = 0; h < nbline - header; h++)
{

string[] MyStringArray = nomdutableau1[h].Split(' ');
//Console.WriteLine(MyStringArray[12]);
nbraw=MyStringArray.lenght();
for (int l = 0; l < nbraw; l++)
{
data[h, l] = MyStringArray[l]; //fill the raws

} 


2/Pour ce qui est de la conversion string==>float il y a une fonction:

float a =Float.Parse(nomdetastring);

Mais cela peut poser problème selon ton OS surtout que tu n 'es pas en France à cause des points et virgule.
Enfin bref je pense que tu comprendras ce que tu dois faire en regardant ceci.

Bonne chance et demande si tu as besoin, ça fait plaisir et j'apprends des trucs en même temps.

Mich
0
Slt voulais juste savoir, dans le code plus haut,que represente header,j'ai recu comme projet de stage,le devoir de developper une Appli pareil,et du coup je suis coincé au niveau de la lecture des valeurs dans le fichier texte enfin de pouvoir les sauvegarder dans un tableu,et par la suite en faire des courbes selon le nombre de valeur representées sur la premiere ligne Horizontale,merci d'avance, j'attend votre aide
0