Парсинг сложной текстовой строки и сохранение каждой записи в переменную - Ja va

У меня есть автоматически сгенерированные строки, подобные следующим:

  40   1655.28   -------   212.61     2.01   ( 40.31%) (  9)STRE C=C (aminoA - part A) -> 1

является ли их любой рациональный и "легкий" способ разделить предыдущую строку на другой, который line.split("\\s+");? и получить что-то вроде следующего:

a0=40
a1=1655.28

...

ai=40.31
aii=9
aiii=STRE C=C
aiv=aminoA - part A

Проблема с line.split("\\s+"); в том, что у меня круглая скобка без пробелов между двумя записями; например:( 9)STRE C=C или же (aminoA - part A), который дает результаты, такие как: ax1=(,ax2=9)STRE а также ay1=(aminoA, Это, конечно, можно уловить, но в этом случае мне нужно проверять каждую запись с помощью нескольких регулярных выражений в - для меня - сложных вложенных if-условиях.

1 ответ

Решение

Таким образом, без фиксированных столбцов я бы использовал регулярное выражение. Я бы также использовал класс для хранения ваших столбцов для удобства поиска.

class Result {

    private static Pattern resultRegex = Pattern.compile(
        "(\\d+)" // 40
        + "\\s+"
        + "(\\d+\\.\\d+)" // 1655.28
        + "\\s+\\-+\\s+"
        + "(\\d+\\.\\d+)" // 212.61
        + "\\s+"
        + "(\\d+\\.\\d+)" // 2.01
        + "\\s+\\(\\s*" // (
        + "(\\d+\\.\\d+)" // 40.31
        + "%\\)\\s+\\(\\s*" // ) (
        + "(\\d)" // 9
        + "\\)" // )
        + "(.*)" // STRE C=C
        + "\\(" // (
        + "(.*)" // aminoA - part A
        + "\\)"); // )

    private final int col0;
    private final double col1;
    private final double col2;
    private final double col3;
    private final double col4;
    private final int col5;
    private final String col6;
    private final String col7;

    Result(String data) {

        Matcher matcher = resultRegex.matcher(data);
        matcher.find();
        col0 = Integer.parseInt(matcher.group(1));
        col1 = Double.parseDouble(matcher.group(2));
        col2 = Double.parseDouble(matcher.group(3));
        col3 = Double.parseDouble(matcher.group(4));
        col4 = Double.parseDouble(matcher.group(5));
        col5 = Integer.parseInt(matcher.group(6));
        col6 = matcher.group(7);
        col7 = matcher.group(8);
    }

    @Override
    public String toString() {
        return new StringBuilder()
            .append("col0=").append(col0)
            .append(",col1=").append(col1)
            .append(",col2=").append(col2)
            .append(",col3=").append(col3)
            .append(",col4=").append(col4)
            .append(",col5=").append(col5)
            .append(",col6=").append(col6)
            .append(",col7=").append(col7).toString();
    }
}

Затем вы можете прочитать каждую строку из вашего файла / потока / что угодно и сделать это

String data = "40   1655.28   -------   212.61     2.01   ( 40.31%) (  9)STRE C=C (aminoA - part A) -> 1";
Result result = new Result(data);
System.out.println(result);

Очевидно, я не добавил никакой проверки, но, надеюсь, это достаточно хороший пример для начала.

Другие вопросы по тегам