我已经完成了从文本文件中读取数据并将其保存到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
答案 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*)");