从文本文件中解析输入

时间:2013-09-14 19:07:28

标签: java parsing filereader

我有一个包含员工信息的文本文件。第一个字是员工的姓氏,第二个字是第一个名字。字符代码h或s告诉我他们是什么样的员工,薪水或每小时。最后,字符代码后的数字是小时工资,如果是小时工,或者如果是受薪雇员的年薪。

Smith, John   h   5.00
Potter, Harry   s   10000

我想要对此信息执行的操作是扫描文本文件,以根据识别的字符代码自动创建新的受薪员工对象或每小时员工对象。

这是每小时员工对象的参数。

public HourlyEmployee(String first, String last, double wage)

这就是我想出来的。

File input = new File("EmployeesIn.txt"); 
Scanner in = new Scanner(input);


while(in.hasNextLine()) {
    int i = 1;
    String line =(in.nextLine());
    if (line.contains(" h ")) {
        HourlyEmployee Employee1 = new HourlyEmployee(in.next(),in.next(),in.nextDouble());
        System.out.println(Employee1);  

这段代码的问题在于我从in.nextDouble()中得到了一个InputMismatchException。

所以我编辑了我的代码,手动将工资分配给1,至少看看它是否正确分配了姓氏和名字,但它甚至没有正确地做到这一点。它使用错误的行来分配值,并将First Name指定为姓氏,将Last Name指定为名字。

Harry, Potter,  $1.0/hour

所以我的问题是,我该如何正确地做到这一点?基于我提供的文本文件,我想创建一个带有这些参数的HourlyEmployee对象

HourlyEmployee Employee1 = new HourlyEmployee(Smith,John,5.00);

2 个答案:

答案 0 :(得分:0)

两个明显的问题:

由于你按顺序阅读文件,你读到的第一件事就是姓氏;但是HourlyEmployee需要的第一个参数是名字。其次,你第三次尝试阅读文件将最终读取'h'或's'标志,而不是薪水。解决方案:单独读取名称,然后调用该函数。像这样:

while(in.hasNextLine()) {
  lastName = in.next();
  firstName = in.next();
  payType = in.next(); // read the 'h' or 's'
  pay = in.nextDouble();
  switch(payType) {
    case 'h': 
      Employee1 = new HourlyEmployee(firstName, lastName, pay);
      break;
    case 's':
      Employee1 = new SalariedEmployee(firstName, lastName, pay);
      break;
    default:
      // warn about invalid format
  }
  System.out.println(Employee1);  
}

您可能需要修改lastName变量的逗号 - 不确定您的功能是否已经处理过。

答案 1 :(得分:0)

为什么只是加载文件并逐行阅读?

由于您的文件结构相同,因此很容易解析/拆分每一行

public static String loadFile(String filePath){



    try {           

        // Open the file that is the first command line parameter
        FileInputStream fstream = new FileInputStream(filePath);
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

        String strLine = null;

        //Read File Line By Line
        while ((strLine = br.readLine()) != null  )   {

                            if(strLine.split("[ ]+").length > 3){
                               // do stuff here
                             }

        }// end while

        //Close the input stream            
        br.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return buff.toString();
}