2012-07-26 32 views
1

我已经给了一个简单的任务,我似乎无法弄清楚如何完成它。使用字符串和整数解析文件c#

我收到了一个既有姓名又有工资率/员工小时数的文本文件。格式如下:

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

我的任务是编写使用的StreamReader从文本文件中提取数据,然后打印员工的名字,并通过速度和时间相乘计算的总工资的程序。

我知道如何用.Split方法分割线条,但是我似乎无法弄清楚如何分离双打/整数的名称。我的解析方法总是返回格式错误,因为它首先读取字符串。我完全卡住了。

这是我的代码到目前为止,任何帮助或指导将不胜感激。

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); 
     } 
    } 
} 

回答

1

使用Decimal.Parseread 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

你为什么用一个名字分割一行,并将其称为'payInfo'?这是误导。我还建议将“阅读”从“解析”中分离出来,使代码更加灵活,更易于测试。 – 2012-07-26 07:33:18

5

您只在循环中读取一行。员工记录似乎包含两行行 - 所以您需要在每次迭代时都读取它们。 (另外,您可以跟踪哪些行你提出来,但是这将是痛苦的。)我想重写循环,就像这样:

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); 
} 

然后有分析两个值一个单独的方法,这将使其更容易测试。

当您解析时,请注意您应该使用decimal而不是double来表示货币值。

+0

发生在我身上的同样的事情。问题中的代码一次只读取一行。这意味着当他读取员工的姓名时,它最终也会被解析为一个整数。但是,如果OP试图在VS中使用调试器,这种事情会被捕获。我不知道他是否知道如何使用它? – chronodekar 2012-07-26 06:36:33

0

你应该使用int.TryParse(string,out int)(int和double)。如果失败了,你可能会有一个字符串,否则,你很幸运。有了这些数据,你知道每一行的第二行是一个字符串,你也许应该把它放在代码中,你可以有一个索引/计数,当这个不均匀时,你应该期望一个字符串。

0

你也可以试试这个。非常简单的修改。

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);