java - 使用 JAVA 将字符串拆分为多个部分并存储到 CSV
问题描述
我有不同格式的数据。我希望首先从输入字符串中提取Quantity ,然后再提取Unit,其余文本应视为item。
代码.java
public String itemsProcesing(List<String> items) throws IOException {
List<String> list = items;
List<String> unitList = Arrays.asList("g", "tbsp", "cm", "kg"");
List<String> quantityList = Arrays.asList("Full", "Quarter", "Half", "3 Quarter", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0");
for (String s : list) {
String[] strArr = s.split(" ");
if (strArr.length == 2) {
String newStr = rewriteString(strArr, quantityList);
strArr = newStr.split(" ");
}
String[] itemLine = new String[3];
for (int i = 0; i < strArr.length; i++) {
String str = strArr[i];
int index = findValueLocation(str, unitList);
itemLine[index] = str;
}
String line = createLineForCSV(itemLine);
writeToFile(line);
}
return "done";
}
private static int findValueLocation(String str, List<String> unitList) {
boolean b = Pattern.matches("\\d{1,3}|\\d/\\d|\\d/\\d[*]\\d|\\d{1,3}[*]\\d{1,3}|\\d{1,3}[*]\\d{1,3}|\\d{1,3}[-]\\d{1,3}|\\d{1,3} [-] \\d{1,3}|\\d.\\d|\\\\d{1,3} - \\\\d{1,3}| \\\\d{1,3} - \\\\d{1,3}| \\\\d{1,3}-\\\\d{1,3}", str);
if (b) {
return 0;
}
for (String unit : unitList) {
if (unit.equals(str)) {
return 1;
}
}
return 2;
}
private static String createLineForCSV(String[] itemLine) {
StringBuilder sb = new StringBuilder();
sb.append(itemLine[0]).append(",");
sb.append(itemLine[1]).append(",");
sb.append(itemLine[2]);
return sb.toString();
}
private static void writeToFile(String line) throws IOException {
BufferedWriter writer = new BufferedWriter(new FileWriter("csv_file.csv", true));
writer.write(line);
writer.newLine();
writer.close();
}
private static String rewriteString(String[] arr, List<String> quantityList) {
String strOne = arr[0];
String strTwo = arr[1];
String newStr = "";
for (String quantity : quantityList) {
if (strOne.contains(quantity)) {
// 8g carrots becomes "8 g carrots"
newStr = quantity + " " + strOne.substring(quantity.length()) + " " + strTwo;
break;
} else if (strTwo.contains(quantity)) {
newStr = quantity + " " + strTwo.substring(quantity.length()) + " " + strOne;
break;
}
}
return newStr;
}
输入数据 1-2 汤匙酱油
输出:1-2,汤匙,酱汁
所需输出:1-2汤匙,酱油
我怎样才能得到所需的结果。
解决方案
我认为只建立一个详尽的测量单位列表就足够了,并沿着它拆分字符串。然后你不需要解析金额。
像这样的东西:
Pattern p=Pattern.compile("(.*?)\\s*(tbsp|k?g|cup|c?m)\\s*(.*)");
List<String> tests=Arrays.asList(
"16g salt",
"1 kg apple",
"1 1/2 tbsp sugar");
for(String s:tests){
Matcher m=p.matcher(s);
if(m.matches())
System.out.println(Arrays.asList(m.group(1),m.group(2),m.group(3)));
}
输出(来自https://ideone.com/9kbozK):
[16, g, salt] [1, kg, apple] [1 1/2, tbsp, sugar]
在现实生活中,应该有一个else
分支来捕获输入中可能出现的错误(或无法识别的单元)。
推荐阅读
- javascript - global.HermesInternal - 属性 'HermesInternal' 在类型 'Global & typeof globalThis' 上不存在
- django - 模型中带有 json 字段的 Django crud api
- javascript - 无法读取未定义的属性“添加事件侦听器”
- python-3.x - flask_wtf 中无法识别自定义验证器
- c - hrtimer_init() 中的 hrtimer 定时器模式与 hrtimer_start() 中的到期模式
- python - python reindex不显示列值
- r - R中的分组以表示地图上每个县的计数?
- list - Haskell List 生成无限循环
- themes - Magento 2.4 - 构建通过作曲家安装的主题的子主题父
- python - 如何制作频道并将某人添加到其中