繁体   English   中英

解析文本文件中的输入

[英]Parsing input from a text file

我有一个包含员工信息的文本文件。 第一个单词是员工的姓氏,第二个单词是名字。 字符代码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,以至少查看它是否正确分配了姓氏和名字,但这样做却不正确。 它使用错误的行来分配值,并且将“姓氏”指定为姓氏,并将“姓氏”指定为姓氏。

Harry, Potter,  $1.0/hour

所以我的问题是,如何正确执行此操作? 基于我提供的文本文件,我想使用这些参数创建一个HourlyEmployee对象

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

两个明显的问题:

由于您按顺序读取文件,因此首先读取的是姓氏。 但是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变量的逗号-不确定您的函数是否已解决此问题。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM