2015-12-13 2 views
0

Я кодирование в Java и есть метод, который возвращает строку, которая выглядит примерно так -Разбивает строку на запятой и игнорировать запятую в двойных кавычках

0, 2, 23131312,"This, is a message", 1212312 

, и я хотел бы строку, которая будет плевать как-

["0", "2", "23131312", "This, is a message", "1212312"] 

Когда я использую метод разделения строки на запятой, она разбивает «Это, является сообщение» и как хорошо, что я не хочу. Я хотел бы, чтобы он проигнорировал эту конкретную запятую и избавился от двойных кавычек, если это возможно.

Я искал ответы и CSV, похоже, это способ сделать это. Однако я не понимаю его должным образом.

Любая помощь приветствуется.

+2

Снимите квадратные скобки и используйте парсер CSV. В противном случае вам придется иметь дело с экранированными двойными кавычками, например ... Или просто проанализировать его как [массив JSON] (http://stackoverflow.com/q/5293555/2071828). –

+0

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

ответ

0

Я думаю, что вы можете использовать регулярное выражение ,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$) здесь:. Splitting on comma outside quotes

You может испытать образец здесь: http://regexr.com/3cddl

Java пример кода:

public static void main(String[] args) { 
    String txt = "0, 2, 23131312,\"This, is a message\", 1212312"; 

    System.out.println(Arrays.toString(txt.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"))); 

} 
+0

Это сделало эту работу. Спасибо, кучи! – callMeJava

0

Простейший способ преобразования главной строки в массив объектов json, который автоматически заботится о фактических элементах и ​​дает вам массив объектов.

0

Еще один способ сделать это - перебирать строку, сохранять индекс, а когда вы нажимаете «», делаете String.substring и вставляете в массив и обновляете индекс. Когда вы попали в двойные кавычки ("), вы ищете другие двойные кавычки, и вставить подстроку в массив и обновить индекс

0

Я комментировать решения, основанные на программировании алгоритма с нуля без помощи каких-либо Весов гу. Я не говорю, что это лучше, чем использование библиотеки.

Во-первых, эта проблема имеет больше причуд, чем казалось бы на первый взгляд. Я имею в виду:

  • Пробеги вокруг запятых необходимо удалить.
  • Возможны синтаксические ошибки, например.
  • Интересно, как бы спрятались двойные кавычки внутри строки, я думаю, двойные кавычки будут удвоены (например, "This, is a ""message"""). Они также должны быть правильно проанализированы.

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

class StringScanner 
{ 
    private final String s; 
    private int currentPosition; 

    public StringScanner (String s) 
    { 
     this.s = s; 
     this.currentPosition = 0; 
     skipWhitespace(); 
    } 

    private void skipWhitespace() 
    { 
     while (currentPosition < s.length() && s.charAt (currentPosition) == ' ') 
      currentPosition++; 
    } 

    private String nextNumber() 
    { 
     final int start = currentPosition; 

     while (currentPosition < s.length() && s.charAt (currentPosition) != ' ') 
      currentPosition++; 

     return s.substring (start, currentPosition); 
    } 

    private String nextString() 
    { 
     if (s.charAt (currentPosition) != '\"') 
      throw new Error ("You should NEVER see this error, no matter what the input string is"); 

     currentPosition++; 
     final int start = currentPosition; 

     // Modify the following loop to test for escaped quotes if necessary 
     while (currentPosition < s.length() && s.charAt (currentPosition) != '\"') 
      currentPosition++; 

     if (currentPosition >= s.length || s.charAt (currentPosition) != '\"') 
      throw new Error ("Parse error: Unterminated string"); 

     final String r = s.substring (start, currentPosition); 

     currentPosition++; 

     return r; 
    } 

    public String nextField() 
    { 
     String r; 

     if (currentPosition >= s.length()) 
      r = null; 
     else if (s.charAt (currentPosition) == '\"') 
      r = nextString(); 
     else 
      r = nextNumber(); 

     skipWhitespace(); 

     if (currentPosition < s.length() && s.charAt (currentPosition) != ',') 
      throw new Error ("Parse error: no comma at end of field"); 

     currentPosition++; 

     skipWhitespace(); 

     if (currentPosition >= s.length()) 
      throw new Error ("Parse error: string ends with comma"); 

     return r; 
    } 
} 

Тогда , разделите строку на что-то вроде:

String s = "0, 1, \"Message, ok?\", 55"; 

StringScanner ss = new StringScanner (s); 

String field = ss.nextField(); 

while (field != null) 
{ 
    System.out.println ("Field found: \"" + field + "\""); 
    field = ss.nextField(); 
} 
Смежные вопросы