2012-07-26 63 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);