Débutant - Manipulation de données d'un .txt

Résolu
strifemarseillais Messages postés 5 Date d'inscription jeudi 12 avril 2007 Statut Membre Dernière intervention 15 mars 2009 - 15 mars 2009 à 10:14
strifemarseillais Messages postés 5 Date d'inscription jeudi 12 avril 2007 Statut Membre Dernière intervention 15 mars 2009 - 15 mars 2009 à 13:26
Bonjour à tous, je suis débutant en C# et j'ai un problème pour manipuler les données provenant d'un txt.
Mon fichier txt se compose de n lignes organisées de cette manière :
01/01/2000/09/00/00/4000
01/01/2000/09/00/01/4001
01/01/2000/09/00/02/4002
01/01/2000/09/00/03/4003
01/01/2000/09/00/04/4004
01/01/2000/09/00/05/4005
01/01/2000/09/00/06/4006
01/01/2000/09/00/07/4007
01/01/2000/09/00/08/4008

Je voudrais tout simplement splitter entre les "/" afin d'obtenir un nombre par case d'un tableau.
Pour être plus clair je voudrais créer un tableau à deux dimensions comme suit:
[0,0] -> 01               [1,0] -> 01  
[0,1] -> 01               [1,1] -> 01  
[0,2] -> 2000           [1,2] -> 2000  
[0,3] -> 09               [1,3] -> 09  
[0,4] -> 00               [1,4] -> 00  
[0,5] -> 00               [1,5] -> 01  
[0,6] -> 4000           [1,6] ->4001

...
J'ai utilisé un StreamReader, j'arrive à afficher mes lignes dans la console mais impossible d'organiser les données dans un tableau.

Merci de votre aide.

9 réponses

MasterShadows Messages postés 268 Date d'inscription lundi 1 mars 2004 Statut Membre Dernière intervention 19 avril 2012 12
15 mars 2009 à 10:40
Salut, je ferais un truc de ce style

string[] result = reader.ReadToEnd().Split(new char [] { '\n' });
int[,] tab = new int[result.Length, 6];

for(int i=0; i < result.Length; i++)
{
    string[] r = result[i].Split(new char [] { '/' });
    for(int j = 0; j < r.Length; j++)
    {
          tab[i, j] =int.Parse(r[j]);
    }
}

Il y'a certainement des choses à améliorer mais l'idée est  là...
3
RougailSaucisse Messages postés 118 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 6 décembre 2010 1
15 mars 2009 à 11:07
j'allais proposer une solution très similaire. Pour voir que cela fonctionne j'affiche le tout dans une textbox, et j'entre ma string en dur pour le test mais bon.
Je considère ici que chaque ligne a exactement le mm formattage (pas de caractere en plus ou en moins), et qu'il n'y aucun espace à part le saut de ligne.

private void SplitLines()
{
string test = "01/02/09/200/10/20\n23/24/98/43/56/98";
string[] lines = test.Split();
string[,] str = new string[lines.Length, lines[0].Split('/').Length];
StringBuilder sb = new StringBuilder();
for (int i = 0; i < lines.Length; i++)
{
string[] number = lines[i].Split('/');
for (int j = 0; j < number.Length; j++)
{
str[i, j] = number[j];
sb.AppendLine(string.Format("str [{0},{1}] = {2}", i, j, str[i, j]));
}
sb.AppendLine(Environment.NewLine);
}

MessageBox.Show(sb.ToString());
}

sinon ben comme dit précédemment il serait plus judicieux de split('\n') au cas ou il y aurait d'autres types d'espacement (espace, tabulation ou autre..).
De plus je stocke ici sous forme de string, mais s'il faut les avoir en Int bien sur il faudra changer le type du tableau et procéder a une conversion comme fait dans le post précédent.
3
strifemarseillais Messages postés 5 Date d'inscription jeudi 12 avril 2007 Statut Membre Dernière intervention 15 mars 2009
15 mars 2009 à 11:55
Merci à vous deux pour vos solutions, quand je compile la tienne MasterShadows j'obtiens une erreur "System.FormatException has occured" je pensais que c'était du au nombre de colonnes du tableau qui est de 7 à la place de 6 je pense mais il me remet la même erreur.

Voila mon code.. enfin ton code lol

  StreamReader fluxInfos = null;
            fluxInfos = new StreamReader("quote.txt");

            string[] result = fluxInfos.ReadToEnd().Split(new char[] { '\n' });
           
            int[,] tab = new int[result.Length, 7];

            for (int i = 0; i < result.Length; i++)
            {
                string[] r = result[i].Split(new char[] { '/' });
                for (int j = 0; j < r.Length; j++)
                {
                    tab[i, j] = int.Parse(r[j]);
                }
            }
0
RougailSaucisse Messages postés 118 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 6 décembre 2010 1
15 mars 2009 à 13:00
doit surement avoir une erreur sur une des chaines recupérées (caractere non numerique), ce qui fait que ta fonction parse te renvoie un formatexception. Verifie bien que ton fichier comporte bien uniquement des nombres.
Sinon en debuggant tu devrais vite identifier le probleme.
0

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

Posez votre question
MasterShadows Messages postés 268 Date d'inscription lundi 1 mars 2004 Statut Membre Dernière intervention 19 avril 2012 12
15 mars 2009 à 13:07
Bien vu pour le 7 à la place du 6 (j'ai lu le sujet trop vite, mais le principe est compris)
Sinon mets un point d'arrêt sur string[] result et effectue un débogage pas par pas pour voir où ça ne colle plus...

L'erreur peut se trouver à int.Parse dans ce cas essaie ceci :

bool success = int.TryParse(r[j], out tab[i, j]);

si success vaut faux alors la coquille viendrait de la façon dont a été construit le fichier.
0
strifemarseillais Messages postés 5 Date d'inscription jeudi 12 avril 2007 Statut Membre Dernière intervention 15 mars 2009
15 mars 2009 à 13:14
Oui j'ai bien vérifié je n'ai que des nombres, j'ai ramené à 2 lignes pour être sur:
01/01/2000/09/00/00/4000
01/01/2000/09/00/01/4001

Avec le débogage il me surligne la ligne
tab[i, j] = int.Parse(r[j]);

en me signalant : "Input string was not in a correct format"

Merci pour votre aide, je suis vraiment pas bon 
0
RougailSaucisse Messages postés 118 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 6 décembre 2010 1
15 mars 2009 à 13:20
ben alors regarde la valeur de r[j] et tu sauras ce qui cloche.
0
strifemarseillais Messages postés 5 Date d'inscription jeudi 12 avril 2007 Statut Membre Dernière intervention 15 mars 2009
15 mars 2009 à 13:20
J'ai essayé avec ton astuce Master , j'ai mis un affichage à l'intérieur de la deuxième boucle, il m'affiche 14 True puis au quinzième un FALSE
0
strifemarseillais Messages postés 5 Date d'inscription jeudi 12 avril 2007 Statut Membre Dernière intervention 15 mars 2009
15 mars 2009 à 13:26
ça marche, c'était une coquille dans l'arborescence de mes fichiers. DSL

Merci beaucoup à tous les deux
0
Rejoignez-nous