Разделение двойных кавычек в Java - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь разделить

"11020199, Abc Germany, aduz ,, 444, bieb, dc, 2, 2222.00, независимо от 5dc, 222.22,22.00," "98,00" ","" 12,00 "", 21-09-2018,06: 00 "

Он имеет двойные кавычки только тогда, когда в строке есть запятая, в противном случае он отделяется только запятой и нетдвойная цитата.Как правильно разделить эту строку?Я видел, как разделить его, когда все в двойных кавычках, но не тогда, когда это делается только тогда, когда есть запятая.

Ответы [ 4 ]

0 голосов
/ 25 октября 2018

Если больше ничего не работает, вы должны сделать это шаг за шагом.Проверьте, что будет дальше (запятые или двойные кавычки) и обрежьте следующее слово.

public static String[] split(String s) {
    List<String> l = new ArrayList<>();

    int begin = 0;
    while (begin < s.length()) {
        int nextQuotes = s.indexOf("\"\"", begin);
        if (nextQuotes == begin) {
            l.add(s.substring(begin + 2, s.indexOf("\"\"", begin + 2)));
            begin = s.indexOf("\"\"", begin + 2) + 2;
            continue;
        }
        int nextComma = s.indexOf(',', begin);
        if (nextComma == begin) {
            l.add("");
            begin++;
            continue;
        } else if (nextComma == -1) {
            l.add(s.substring(begin));
            begin = s.length();
            continue;
        }
        l.add(s.substring(begin, nextComma));
        begin = nextComma + 1;
    }
    return l.toArray(new String[] {});
}

Не лучшее решение, но оно работает.

0 голосов
/ 25 октября 2018

Вы можете сделать это, как показано ниже [Вы можете улучшить извлечение некоторой части в некоторый метод, но это все равно будет работать для вас]

    String[] splittedData = s.split(",");
    List<String> data = new ArrayList<>(splittedData.length);

    StringBuilder sb = new StringBuilder();
    for (String splittedDataPart : splittedData) {
        splittedDataPart = splittedDataPart.trim();
        if (sb.length() == 0 && !splittedDataPart.startsWith("\"")) {
            data.add(splittedDataPart);
            continue;
        }

        if (sb.length() != 0)
            sb.append(",");
        sb.append(splittedDataPart.replace("\"", ""));


        if (splittedDataPart.endsWith("\"")) {
            data.add(sb.toString());
            sb.setLength(0);//clearing
        }
    }
0 голосов
/ 25 октября 2018

Интересная проблема.Здесь возможное решение (хотя я сам на самом деле не доволен им ..)

String str = "11020199,Abc Germany ,aduz,,444,bieb,dc,2 ,2222.00,whatever 5dc,222.22,22.00,\"\"98,00\"\",\"\"12,00\"\",21-09-2018,06:00";

// Replace the comma between double quotes with a replacement char you're sure isn't in the String:
// TODO: Use a more suitable character, I don't know what your text can/cannot contain
String modifiedStr = str.replaceAll("(\"\"[^,]+),([^,]+\"\")", "$1?$2");

// Now split by comma:
String[] array = modifiedStr.split(",");

// And then change the replacement char back again to a comma:
for(int i=0; i<array.length; i++)
  array[i] = array[i].replace("?", ",");

Попробуйте онлайн.

ПРИМЕЧАНИЕ: Предполагается, что значения между двойными двойными кавычками будут содержать только одну запятую.

0 голосов
/ 25 октября 2018

Простое примерное решение может быть таким, которое заботится о сохранении запятой в двойных кавычках:

Сначала разделите String запятой и используйте двойные кавычки для последующего слияния их значений.:

public class SplitAndKeepQuotedValuesCommas {

    public static void main(String[] args) {
        String source = "11020199,Abc Germany ,aduz,,444,bieb,dc,2 ,2222.00,whatever 5dc,222.22,22.00,\"\"98,00\"\",\"\"12,00\"\",21-09-2018,06:00";

        // split the String by comma
        String[] justValues = source.split(",");

        // print all items in the result
        for (String s : justValues) {
            System.out.println(s);
        }

        // prepare a List for all the values
        List<String> resultList = new ArrayList<String>();

        // then go through the values
        for (int i = 0; i < justValues.length; i++) {
            // and check if there is a String that begins with double double quotes
            if (justValues[i].startsWith("\"\"")) {
                /*
                 * if there is one, remove the double quotes from it and its successor,
                 * then concatenate them with a comma in between and add the result to the list
                 */
                String merged = justValues[i].replace("\"\"", "") + "," + justValues[i + 1].replace("\"\"", "");
                resultList.add(merged);
            /*
             * since there are still values with trailing double double quotes,
             * only add values without because they have already been added inside the merged value
             */
            } else if (!justValues[i].endsWith("\"\"")) {
                resultList.add(justValues[i]);
            }
        }

        resultList.forEach(value -> {
            System.out.println(value);
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...