2008-12-12 7 views
1

J'ai trouvé cette question dans une ancienne question sur votre site, donc je pensais que je peux le faire, mais je pense que je me suis trompé :-)lecture d'un fichier texte dans un tableau en dents de scie

l'ancien poste était here

Je suis nouveau à la chose du tableau en dents de scie tout comme le code suivant

StreamReader rows = new StreamReader("c:\\practice.txt"); 
      string line; 
      int i; 
      i=1; 
      while ((line = rows.ReadLine()) != null) 
      { 
       String[][]rows = new String [i][]; ; 
       rows = rows.ReadLine(); 
       String[][] rows = new string[S.Length][]; 
       i++; 
      } 
      for (int i; i < S.Length; i++) 
      { 

       row[i] = S[I].Split(','); 

      } 

      int totalCounter = 0, totalSum = 0; 
      // etc 
      foreach(string[] row in rows) 
      {  
       int m1 = int.Parse(row[3]); 
       totalCounter++; 
       totalSum += m1; 
       switch(row[2]) 
       {   
        case "male": 
        maleCount++;    
        maleSum += m1;    
         break;   
        case "female":    
         femaleCount++;    
         femaleSum += m1;    
         break;  
       } 
      } 

Je sais que je l'ai fait des erreurs majeures, mais à l'est, j'ai essayé quelqu'un peut me aider à faire un code Workin

+0

A peine vieux - C'était hier, et toujours mis à jour aujourd'hui ... –

+0

a ajouté un exemple par demande –

+0

Je ne suis pas convaincu par le "non-devoirs" ... dans la même classe que suzana ou quelque chose? –

Répondre

2

Vous semblez être à double lecture des lignes, ou peut-être que vous avez mélangé des lignes et des cellules - ce bit en particulier regarde vraiment étrange:

 while ((line = rows.ReadLine()) != null) 
     { 
      String[][]rows = new String [i][]; ; 
      rows = rows.ReadLine(); 
      String[][] rows = new string[S.Length][]; 
      i++; 
     } 

-à-dire les lignes de re-déclarer, deux appels à ReadLine par boucle, etc. Je suppose que vous voulez dire string.Split? De toute façon, soit utiliser File.ReadAllLines, ou regarder certaines des options présentées hier. Si vous êtes désespéré d'utiliser des tableaux, le noyau pourrait ressembler à:

using System; 
using System.IO; 
static class Program 
{ 
    static void Main() 
    { 
     string[] lines = File.ReadAllLines("foo.txt"); 
     string[][] grid = new string[lines.Length][]; 
     for (int i = 0; i < lines.Length; i++) 
     { 
      grid[i] = lines[i].Split(','); 
     } 

     int totalCount = 0, maleCount = 0, femaleCount = 0, 
      m1Total = 0, m2Total = 0, m3Total = 0, 
      m1MaleTotal = 0, m1FemaleTotal = 0; 
     foreach (string[] line in grid) 
     { 
      totalCount++; 
      int m1 = int.Parse(line[3]), 
       m2 = int.Parse(line[4]), 
       m3 = int.Parse(line[5]); 
      m1Total += m1; 
      m2Total += m2; 
      m3Total += m3; 
      switch (line[1].Trim()) 
      { 
       case "male": 
        maleCount++; 
        m1MaleTotal += m1; 
        break; 
       case "female": 
        femaleCount++; 
        m1FemaleTotal += m1; 
        break; 
      } 
     } 
     Console.WriteLine("Rows: " + totalCount); 
     Console.WriteLine("Total m1: " + m1Total); 
     Console.WriteLine("Average m1: " + ((double)m1Total)/totalCount); 
     Console.WriteLine("Male Average m1: " + ((double)m1MaleTotal)/maleCount); 
     Console.WriteLine("Female Average m1: " + ((double)m1FemaleTotal)/femaleCount); 
    } 
} 

Encore une fois - je ne peux pas insister assez sur combien vous devriez faire cela avec LINQ au lieu de mise en boucle manuelle ...

+0

options d'hier sont si avance je ne peux pas le faire, mais pouvez-vous montrez-moi comment résoudre ce problème –

+0

mais si je veux compter le m2 et le m3 –

+0

merci Marc vous êtes le Best of the Best –

2

Tout d'abord, assurez-vous d'inclure les ressources non gérées telles que les flux dans les instructions.

Personnellement, j'aime ma classe LineReader qui permet de lire facilement les lignes de texte d'un fichier (ou toute autre chose, en fait).

Ensuite, je voudrais avoid using arrays à moins que vous ne le deviez vraiment. List<T> est généralement beaucoup plus agréable à travailler. Maintenant, si string.Split fait ce que vous voulez, vous pouvez facilement avoir un List<String[]>. Sinon, vous pouvez probablement faire beaucoup de travail en utilisant LINQ:

var query = from line in new LineReader("c:\\practice.txt") 
      let parts = line.Split(',') 
      select new { Gender=parts[2], Amount=int.Parse(parts[3]) }; 

En prenant plusieurs agrégats à partir d'un seul flux de données est difficile dans « normal » LINQ (ce qui est la raison pour laquelle Marc Gravell et moi avons développé Push LINQ). Cependant, vous pouvez utiliser une instruction foreach normale:

int totalCounter = 0, totalSum = 0; 
int maleCount = 0, maleSum = 0, femaleCount = 0, femaleSum = 0; 
foreach (var row in query) 
{ 
    totalCounter++; 
    totalSum += row.Amount; 
    switch (row.Gender) 
    { 
     case "male": 
      maleCount++; 
      maleSum += Amount; 
      break; 
     case "female": 
      femaleCount++; 
      femaleSum += Amount; 
      break; 
    } 
} 

Si vous avez regroupé les lignes en fonction du sexe que vous pourriez être en mesure de rendre cela encore plus simple, surtout si vous savez que le sexe est toujours « mâle » ou « femelle » .

+0

grand mais peut encore le faire par tableaux –

+0

J'ai eu l'exemple PushLINQ hier ;-p –

+0

brandon: Si vous voulez un tableau, il suffit d'appeler ToArray() –

Questions connexes