2014-09-24 6 views
0

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

String s = ""Aac 1Zl Aachen",,DE,5048.850N,00611.483E,189.0m,1,,,,"AACHEN"" 

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

Полученный массив должен выглядеть следующим образом:

array[0] = ""Aac 1Zl Aachen"" 
    array[1] = null 
    array[2] = "DE" 
    array[3] = "5048.850N" 
    array[4] = "00611.483E" 
    array[5] = "189.0m" 
    array[6] = "1" 
    array[7] = null 
    array[8] = null 
    array[9] = null 
    array[10] = ""AACHEN"" 
+0

Во-первых, вы должны избежать этих цитат ... и смотреть в строку разделить – user1071777

+0

Там нет никакой выгоды, оставляя строки кавычки как часть стоимости, или присвоение NULL. – sln

ответ

2

Вы можете разделить запятой и после процесса результирующих массивов:

String[] toks = 
     "\"Aac 1Zl Aachen\",,DE,5048.850N,00611.483E,189.0m,1,,,,\"AACHEN\"".split(","); 
for (int i=0; i<toks.length; i++) { 
    if ("".equals(toks[i])) 
     toks[i] = null; 
} 
+0

Работает ли она, если запятая находится внутри поля, указанного в кавычках? – sln

+0

Я могу легко написать регулярное выражение, чтобы заботиться о котировках, но это не вопрос. – anubhava

+0

Я считаю, что OP не мог понять, как сохранить пустые значения между несколькими запятыми, как «null». – anubhava

2

Вы можете использовать split, метод String, и заменить пустую строку с нулем

import java.util.Arrays; 

public class RegFun { 

    public static void main(String[] args) { 
     String s = "\"Aac 1Zl Aachen\",,DE,5048.850N,00611.483E,189.0m,1,,,,\"AACHEN\""; 
     String[] split = s.split(","); 

     for (int i = 0; i < split.length; i++) { 
      if (split[i].equals("")) { 
       split[i] = null; 
      } 
     } 

     System.out.println(Arrays.toString(split)); 
    } 
} 

["Aac 1Zl Aachen", null, DE, 5048.850N, 00611.483E, 189.0m, 1, null, null, null, "AACHEN"] 
0
String str = "This is String , split by StringTokenizer, created by mkyong"; 
       StringTokenizer st = new StringTokenizer(str, ",");//split by commas 
0

Я не уверен, что NULL является окончательным решением, так как расщепление на запятая в одиночку просто приглашает
неприятности. Возможно, если Java поддерживает split() с использованием регулярного выражения, вы можете использовать для него \s*,\s*.

Другое, лучшее решение - использовать реальное регулярное выражение csv, которое не только обрезает поле,
, но и учитывает запятую внутри кавычек. Последнее, если возможно, делает использование раскола
несостоятельным.

Поскольку поля обрезаны, NULL не требуется в качестве проверки, используя длину в качестве альтернативы.
В regex jargin NULL означает, что группа ничего не соответствует. В массиве jargin, как в C/C++,
NULL означает указатель, которому не присвоено значение. Использование обрезки устраняет двусмысленность.

Чтобы сделать это правильно ...

Вы можете использовать это как найти все регулярное выражение. Каждое значение возвращается в группе 1 или 2.
Просто введите $1$2.

Каждое поле также обрезано (ведущее/конечное) пробелов.

# "\\G(?:(?:^|,)\\s*)(?:\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"|([^,]*?))(?:\\s*(?:(?=,)|$))" 

\G 
(?:       # leading comma + optional whitespaces 
     (?:^| ,) 
     \s* 
) 
(?:       # Cluster group 
     " 
     (       # (1), double quoted string data 
      [^"\\]* 
      (?: \\ . [^"\\]*)* 
    ) 
     " 
    |        # OR 
     ([^,]*?)     # (2), non-quoted field 
) 
(?:       # trailing optional whitespaces 
     \s* 
     (?: 
      (?= ,) 
     | $ 
    ) 
) 
Смежные вопросы