解析文本文件以进行计算

时间:2011-11-28 18:36:48

标签: java parsing

以下是我正在尝试做的一个例子,它应该引导我走向正确的轨道

我有一个txt文件,如:

  2*3
  4-4
  4+2  
  8*1

对于每一行,我需要分隔数字并确定动作类型(例如第一行中的乘法),这样我就可以创建以下输出:

  6
  0
  6
  8
  • 我应该使用分隔符来分隔它们(不太清楚该怎么做 因为分隔符可能是+, - ,*和/)?

  • 或者使用for循环? (我当然希望避免这个...)

5 个答案:

答案 0 :(得分:4)

一个解决方案(没有错误检查,如果需要,可以添加它)可以使用:

<强> myfile.txt的

2 + 2

代码段

Scanner sc = new Scanner(new File("myfile.txt"));
double firstNumber = sc.nextDouble();
String operation = sc.next("[+-/\\*]");
double secondNumber = sc.nextDouble();

double result;
if("+".equals(operation))
  result = firstNumber + secondNumber;
else if("-".equals(operation))
  result = firstNumber - secondNumber;
else if("*".equals(operation))
  result = firstNumber * secondNumber;
else if("/".equals(operation))
  result = firstNumber / secondNumber;
else
  System.out.println("Operation unrecognized");

System.out.println(firstNumber + operation + secondNumber + " = " + result);

答案 1 :(得分:3)

这是一个非常简单的答案,如果没有像你描述的那样形成数据,那么这个答案并不十分强大。

static Pattern pattern = Pattern.compile("([0-9]+)([+-/\\*])([0-9]+)");
public static int calculate(String arg) {
    Matcher matcher = pattern.matcher(arg);
    if (matcher.find()) {
        int a = Integer.parseInt(matcher.group(1));
        int b = Integer.parseInt(matcher.group(3));
        String operator = matcher.group(2);
        if ("+".equals(operator)) {
            return a+b;
        } else if ("-".equals(operator)) {
            return a-b;
        } else if ("/".equals(operator)) {
            return a/b;
        } else if ("*".equals(operator)) {
            return a*b;
        }
    }
    throw new IllegalArgumentException("Could not parse '" + arg + " '");
}

它将字符串解析为三个组,第一组数字,然后是(+, - ,/或*)中的一个,然后是另一组数字。

答案 2 :(得分:1)

//puesdocode
while end of file not reached
{
   int x = next int from input file
   char ch = next char from input file
   int y = next int from input file
   int z;
   switch(ch)
   {
      case '*': z = x*y; break;
      case '/': z = x/y; break;
      case '-': z = x-y; break;
      case '+': z = x+y; break;
   }
   println to file (z);
}

答案 3 :(得分:0)

我建议使用arity - Arithmetic Engine for Java,而不是构建自己的(因为当你开始支持每行的多个操作/操作数时,这会变得复杂)。以下是他们网站的示例。

import org.javia.arity.Symbols;
import org.javia.arity.SyntaxException;

public class Try {
    public static void main(String args[]) throws SyntaxException {
        Symbols symbols = new Symbols();
        double value = symbols.eval("2^10");
    }
}

答案 4 :(得分:0)

ScriptEngine的ECMAScript(JavaScript)引擎可以逐行进行计算。