2016-01-07 5 views
2

У меня есть массивный текстовый файл, который я должен вручную разобрать. Другого пути нет, но перебирать его.Java: Замените пробелы в строке с другим символом пробела?

Я захватываю каждую из строк в файле и .split (""), чтобы получить отдельные компоненты - некоторые из них - массивы int, другие - массивы char, а некоторые другие - текстовые строки.

Текстовые строки вызывают у меня головную боль, потому что иногда у них есть место.

Пример линии что-то вроде:

String strLine = "Identifier {2 4 \"#0# == \\\"This String\\\"\" 12 21 6} 

Когда я делаю следующее:

String[] strParts = strLine.split(" "); 

Полученный вывод является массив строк, который имеет значения строка:

Identifier,{2,4,"#0#,==,\"This,String\"",12,21,6} 

Мне нужен выход:

Identifier,{2,4,"#0# == \"This String\"",12,21,6} 

Так что я обдумываю, есть ли другой символ пробела, который я могу применить к строкам внутри кавычек до выполнения split().

Кто-нибудь знает об одном?

Я также рассмотрело погружение в RegEx, но я не работал с RegEx достаточно, чтобы быть в состоянии сформулировать логику вокруг раскола правильно -. Разделить на пространстве, если это пространство не находится между первой и последней цитатой»

Thx.

[Update]

Я добавляю это здесь, потому что форматирование кода в ответах не является оптимальным.

String strLine = "Identifier {2 4 \"#0# == \\\"This String\\\"\" 12 21 6}"; 

String delim = "§"; //use the Section Sign as a delimeter 

    StringBuilder sb = new StringBuilder(); 
    //first part 
    sb.append(new String(strLine.substring(0,strLine.indexOf("\"")))); 

    //middle part 
    sb.append(new String(strLine.substring(strLine.indexOf("\""),strLine.lastIndexOf("\""))).replace(" ", delim)); 

    //last part 
    sb.append(new String(strLine.substring(strLine.lastIndexOf("\"")))); 

    //make array 
    String[] parts = sb.toString().split(" "); 

Мне нужно будет заменить эти символы делиметра позже, но по крайней мере он делает то, что мне нужно сейчас.

Спасибо всем за предложения, это была их комбинация, которая в конечном итоге решила это для меня.

+1

Не понимаю, что вам нужно, не могли бы вы добавить, что будет результат для этой линии после раскола или, что линия должна стала перед расколом. –

+4

Я думаю, что традиционная 'for'-loop над всем персонажем и следящим образом или не вы в кавычной строке также должна работать. (В основном 'for (...) {if (currentChar == '"') insideQuotedString =! InsideQuotedString; else {if (insideQuotedString)/* добавить в строковый литерал */else/* неупорядоченные данные * /} '. можно найти на https://stackoverflow.com/questions/7804335/split-string-on-spaces-in-java-except-if-between-quotes-ie-treat-hello-wor или https: // stackoverflow .com/questions/7212276/parsing-quoted-text-in-java –

+0

Спасибо за ответы. Я отредактировал свое оригинальное сообщение с более подробной информацией о текущем выходе и нужный вывод. Итерация на уровне персонажа произошла со мной, может быть неизвестным количеством «String in the String», поэтому мне нужно будет отслеживать каждый уровень кавычек, чтобы иметь дело только с внешними цитатами и оставить остальное как есть. – Bandolier2k

ответ

1

Вам не нужно заменять пространственные пространства пробелом. Попробуйте что-то довольно уникальное: «_! _!»

Ищите свою строку подстановки сначала, чтобы убедиться, что ее нет в файле, а затем выполните замену.

Затем сделайте свой обычный сплит.

И, наконец, замените заменяющую строку нормальным пространством в готовом продукте.

+1

Я рассмотрел это, но потом я подумал, что я не знаю 't контролировать то, что кто-то помещает в определенные текстовые поля. Я могу просто выбрать что-то ОЧЕНЬ вне нормы или в расширенном наборе символов или так похоже, это так. Я также пытался не иметь дело с этим текстом во второй раз. – Bandolier2k

+0

Это версия того, что я собираюсь сейчас: 'String strLine =" Идентификатор {2 4 \ "# 0 # == \\\" Эта строка \\\ "\" 12 21 6} "; Строка delim = "§"; // используйте знак раздела как делиметр StringBuilder sb = new StringBuilder(); sb.append (new String (strLine.substring (0, strLine.indexOf ("\" ")))); sb.append (новая строка (strLine.substring (strLine.indexOf (" \ ""), strLine .lastIndexOf ("\" "))). replace (" ", delim)) sb.append (новая строка (strLine.substring (strLine.lastIndexOf (" \ "")))); // make array String [] parts = sb.toString(). Split (""); ' – Bandolier2k

+0

Если вы уверены, что в строке есть только одна строка с кавычками, вы можете разбить первую подстроку и добавить ее детали к массиву «parts», найдите строку с кавычками и добавьте ее в массив «parts», а затем разделите остальную часть строки и добавьте ее в массив «parts» - никаких замен не требуется. – marklark

1

Не совсем элегантно, но думаю, что это делает работу:

private static String[] mySplit(String src) 
{ 
    int firstIdx = src.indexOf('"'); 
    int lastIdx = src.lastIndexOf('"'); 
    if (firstIdx == lastIdx) 
     return src.split(" "); 
    if (src.charAt(lastIdx+1) == ' ') 
     lastIdx++; 
    // first part 
    String[] firstPart = src.substring(0, firstIdx-1).split(" "); 
    String[] lastPart = src.substring(lastIdx+1).split(" "); 

    String[] res = new String[firstPart.length+1+lastPart.length]; 
    System.arraycopy(firstPart,0,res,0, firstPart.length); 
    res[firstPart.length] = src.substring(src.indexOf('"'), src.lastIndexOf('"')); 
    System.arraycopy(lastPart,0,res,firstPart.length+1, lastPart.length); 
    return res; 
} 
Смежные вопросы