Парсинг сложной текстовой строки и сохранение каждой записи в переменную - 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);
Очевидно, я не добавил никакой проверки, но, надеюсь, это достаточно хороший пример для начала.