读取并分析同一行包含数字和字母的文本文件

时间:2016-12-21 00:40:48

标签: java

我已经完成了从文本文件中读取数据并将其保存到Set的任务。文本文件代表一个虚构的帐单,其中包含某些项目描述及其价格,数量和总和。我只需要物品的名称和价格。文本文件如下所示:

Item_name   Item_price(float value with comma as format symbol)  Quantity(int)  Total(float)
Item_name   Item_price(float value with comma as format symbol)  Quantity(int)  Total(float)

(文本文件包含多个项目)。此外,项目有时会在其名称中包含数字,例如。 LG 4k电视1000U)。

我试图像这样解决它:

private void readAndSave(Path file) {
    try (BufferedReader br = new BufferedReader(new InputStreamReader(
             new BufferedInputStream(new FileInputStream(file.toString()))))) {


        Set<Item> items = new TreeSet<>();
        String line;
        while ((line = br.readLine()) != null) {


            float price = 0, numb;
            boolean priceFound = false;
            String name = "";
            String[] lineElements;
            lineElements = line.split(" ");

            for(String temp: lineElements) {
                if((numb = getNumberRepresentation(temp)) != -1) {
                    if(!priceFound) {
                        price = numb;
                        priceFound = true;
                    }
                    break;
                }

                name += temp + " ";
            }
            items.add(new Item(name, price));

        }
    } catch (FileNotFoundException fe) {
        System.out.println("File not found!");
    } catch (IOException e) {
        System.out.println("Error while opening/writing files!");
    }

}

Item包含两个表示项目名称和价格的变量(String,float),并扩展Comparable

这是getNumberRepresentation方法

private float getNumberRepresentation(String temp) {
    try {

        DecimalFormatSymbols symbols = new DecimalFormatSymbols();
        symbols.setDecimalSeparator(',');
        DecimalFormat format = new DecimalFormat("0.##");
        format.setDecimalFormatSymbols(symbols);
        return format.parse(temp).floatValue();

    } catch(Exception e) {
        return -1;
    }
}

我试图使用这样的逻辑:如果找到了价格,那么该名称也必须已经找到,并且可以跳过该行中的所有其他字符串。这里的问题是,有时我从一个项目的名称中得到一个数字作为价格(1000U,来自前面的例子)。是否有更好,更有效的解决方案来解决这个问题?

编辑:文件示例

Escape from Paradise City 70,00 1135 79450,00 Sony ITC60, TV cabel 111,26 111 12349,86

1 个答案:

答案 0 :(得分:0)

您需要使用java.util.regex.Pattern并在正则表达式匹配之前获取所有内容,以获取成本和正则表达式与成本的匹配。我假设名称中没有任何东西看起来像###,##其中#是数字。 (由正则表达式中的\ d表示)。

可以找到教程here.

它看起来像这样:

在阅读专栏之前:

[HttpPost]
public ActionResult Index(string Name)
{
 ViewBag.Message = "Some message";
 //Like Server.Transfer() in Asp.Net WebForm
 return View("MyIndex");
}

对于每一行:

Pattern p = Pattern.compile("(.*?) (\\d*,\\d*)");