2012-07-26 3 views
1

On m'a donné une tâche simple, que je n'arrive pas à comprendre comment l'accomplir.Analyse d'un fichier avec des chaînes et des entiers C#

J'ai reçu un fichier texte qui contient à la fois les noms et le taux de rémunération/heures des employés. Le format est le suivant:

Mary Jones 
12.50 30 
Bill Smith 
10.00 40 
Sam Brown 
9.50 40 

Ma tâche est d'écrire un programme qui utilise StreamReader pour extraire les données à partir d'un fichier texte, puis imprimer le nom des employés, et calculer la rémunération totale en multipliant le taux et les heures.

Je sais comment diviser la ligne avec une méthode .Split, mais je n'arrive pas à comprendre comment séparer les noms des doubles/ints. Mes méthodes d'analyse reviennent toujours avec une erreur de format parce qu'elle lit les chaînes en premier. Je suis complètement coincé.

Voici mon code pour l'instant, toute aide ou conseil serait apprécié.

using System; 
using System.IO; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

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

      StreamReader myfile = new StreamReader("data.txt"); 
      string fromFile; 

      do 
      { 
       fromFile = myfile.ReadLine(); 
       if (fromFile != null) 
       { 
        string[] payInfo = fromFile.Split(); 
        double wage = double.Parse(payInfo[0]); 
        int hours = int.Parse(payInfo[1]); 
        Console.WriteLine(fromFile); 
        Console.WriteLine(wage * hours); 
       } 
      } while (fromFile != null); 
     } 
    } 
} 

Répondre

1

Utilisez Decimal.Parse et read two line:

do 
{ 
    name = myfile.ReadLine(); 
    if (name != null) 
    { 
     // read second line 
     var nums = myfile.ReadLine(); 
     if (nums != null) 
     { 
      string[] payNums = nums.Split(new[] {' '}); 
      Console.WriteLine("{0}: {1}", 
           name, 
           Decimal.Parse(payNums[0]) 
           * Decimal.Parse(payNums[1])); 
     } 
    } 
} while (name != null); 
+0

Pourquoi divisez-vous une ligne avec juste des noms, et appelez-la 'payInfo'? C'est trompeur. Je suggérerais également que séparer la "lecture" de "parsing" rend le code plus flexible et plus facile à tester. –

5

Vous ne lisez qu'une ligne dans la boucle. Un enregistrement d'employé semble comporter deux lignes - vous devez donc les lire tous les deux à chaque itération. (Sinon, vous pouvez garder une trace de la ligne que vous étiez à, mais ce serait douloureux.) Je réécrire la boucle comme quelque chose comme:

string name; 
while ((name = reader.ReadLine()) != null) 
{ 
    string payText = reader.ReadLine(); 
    if (payText == null) 
    { 
     // Or whatever exception you want to throw... 
     throw new InvalidDataException("Odd number of lines in file"); 
    } 
    Employee employee = ParseTextValues(name, payText); 
    Console.WriteLine("{0}: {1}", employee.Name, employee.Hours * employee.Wage); 
} 

Ensuite, ont une méthode distincte pour analyser les deux valeurs, qui sera le rendre plus facile à tester.

Lorsque vous analysez, notez que vous devez utiliser decimal plutôt que double pour représenter les valeurs monétaires.

+0

Exactement la même chose qui m'est venue à l'esprit. Le code de la question lit uniquement une ligne à la fois. ce qui signifie que quand il lit le nom d'un employé, il finira par être analysé comme un entier. Cependant, ce genre de chose serait pris si le PO avait essayé d'utiliser le débogueur dans VS. Je me demande s'il sait comment l'utiliser? – chronodekar

0

Vous devez utiliser int.TryParse (string, out int) (int et double). Si cela échoue, vous avez probablement une chaîne, sinon, vous avez de la chance. Avec ces données, où vous savez que chaque seconde ligne est une chaîne, vous devriez probablement mettre cela dans le code aussi, vous pourriez avoir un index/nombre, et quand cela est inégal, vous devriez vous attendre à une chaîne.

0

Vous pouvez également essayer. Modifications très simples

do 
{ 
    fromFile = myfile.ReadLine(); 
    fromFile += @" " + myfile.ReadLine(); 
    if (fromFile != null) 
    { 
     string[] payInfo = fromFile.Split(); 
     double wage = double.Parse(payInfo[2]); 
     int hours = int.Parse(payInfo[3]); 
     Console.WriteLine(fromFile); 
     Console.WriteLine(wage * hours); 
    } 
} while (fromFile != null); 
Questions connexes