РЕДАКТИРОВАТЬ: Исходя из того, что вы сказали что-то вроде "8 г моркови" может быть "8 г моркови", я обновил оригинальный код и добавил новый метод в нижней части.
Вот решение Я придумал. Поскольку вы сказали, что заказ не гарантирован, и нам не нужно проверять, действителен ли «товар», я сделал это следующим образом:
public static void parseToCSV() throws IOException {
List<String> list = generateList();
List<String> unitList = Arrays.asList("g", "kg","ml","l");
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(" ");
// Checks if the String array is too short for what we need(i.e "8g carrots" instead of "8 g carrots")
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, quantityList, unitList);
itemLine[index] = str;
}
String line = createLineForCSV(itemLine);
writeToFile(line);
}
}
private static List<String> generateList() {
List<String> list = new ArrayList<>();
String inputOne = "1 kg potatoes";
String inputTwo = "3 g juice";
String inputThree = "8g carrots";
list.add(inputOne);
list.add(inputTwo);
list.add(inputThree);
return list;
}
/**
* Return the index where the value should go in a comma separated String. If the
* value is not found in either list then it is the item by default.
*/
private static int findValueLocation(String str, List<String> quantityList, List<String> unitList) {
for(String quantity : quantityList) {
if(quantity.equals(str)) {
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 {
// Set to true for append mode
BufferedWriter writer = new BufferedWriter(new FileWriter("csv_file.csv", true));
writer.write(line);
writer.newLine();
writer.close();
}
Это работает, когда я проверял его. Единственное, он всегда будет добавляться в файл CSV при каждом запуске. Если вам нужна опция очистки файла, чтобы вы могли записать все данные для sh, вы можете просто добавить этот метод:
private static void clearFile() throws IOException {
FileWriter writer = new FileWriter("csv_file.csv", false);
writer.write("");
writer.close();
}
РЕДАКТИРОВАТЬ: Новый метод, чтобы исправить проблему «8g» вместо «8 г». То, что это делает, проверяет, имеет ли разделенная строка длину 2. Если так, то она не разделена должным образом. Мы проверяем количествоList, так как оно никогда не должно называться «морковкой g8». Мы находим количество, создаем новую строку и возвращаем ее как правильно созданную строку. Вид хакерского решения, но оно работает для меня.
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;
}
Надеюсь, это поможет!