2017-01-10 2 views
0

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

Входной

"abcd","12345","success,1234,out",,"hai" 

Выход должен быть как ниже

Колонка 1: «ABCD»

Колонка 2: "12345"

Колонка 3: "успех, 1234, из"

Колонка 4: нулевой

Колонка 5: «хаи»

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

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

+0

Соскучились запятая в вашем выходе? –

+0

Что вы пробовали? разместите здесь свой код. –

+0

Нет необходимости в Regex. Просто разделите эту строку на '', '', удалите все '' '(первая и последняя запись) -> у вас будет' String [] 'like' [[abcd] [12345] [success, 1234, out] [null] [hai]] '(где [null] - это« NULL », а не String« null »). Затем вы можете присоединиться к вашему желаемому формату. – Fildor

ответ

1

Вы можете попробовать инструмент как CSVReader из OpenCsv https://sourceforge.net/projects/opencsv/

Вы даже можете настроить CSVParser (используется считывателем) для вывода null на несколько условий. Из дока:

/** 
* Denotes what field contents will cause the parser to return null: EMPTY_SEPARATORS, EMPTY_QUOTES, BOTH, NEITHER (default) 
*/ 
public static final CSVReaderNullFieldIndicator DEFAULT_NULL_FIELD_INDICATOR = NEITHER; 
+0

Извините, что я использую инструмент Talend etl для загрузки этого CSV-файла. –

0

Вы можете использовать регулярные выражения

"([^"]*)" 

DEMO: https://regex101.com/r/WpgU9W/1

Match 1 
Group 1. 1-5  `abcd` 

Match 2 
Group 1. 8-13 `12345` 

Match 3 
Group 1. 16-32 `success,1234,out` 

Match 4 
Group 1. 36-39 `hai` 
+0

Спасибо для вашего ответа .... Мне нужно захватить NULL и т. д. Столбец 4 должен быть NULL, так как в источнике мы получаем ,, –

0

Использование ("[^"]+")|(?<=,)(,) регулярного выражения, вы можете обнаружить, либо строки в кавычках ("[^"]+"), который следует рассматривать как есть или запятыми, предшествующими b y запятыми, которые обозначают значения нулевого поля.Все, что вам теперь нужно перебирать матчи и проверить, какой из двух групп захвата определенных и выходе соответственно:

String input = "\"abcd\",\"12345\",\"success,1234,out\",,\"hai\""; 
Pattern pattern = Pattern.compile("(\"[^\"]+\")|(?<=,)(,)"); 
Matcher matcher = pattern.matcher(input); 
int col = 1; 
while (matcher.find()) { 
    if (matcher.group(1) != null) { 
     System.out.println("Column " + col + ": " + matcher.group(1)); 
     col++; 
    } else if (matcher.group(2) != null) { 
     System.out.println("Column " + col + ": null"); 
     col++; 
    } 
} 

Демо: https://ideone.com/QmCzPE

0

Шаг № 1:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

final String regex = "(,,)"; 
final String string = "\"abcd\",\"12345\",\"success,1234,out\",,\"hai\"\n" 
    + "\"abcd\",\"12345\",\"success,1234,out\",\"null\",\"hai\""; 
final String subst = ",\"null\","; 

final Pattern pattern = Pattern.compile(regex); 
final Matcher matcher = pattern.matcher(string); 

// The substituted value will be contained in the result variable 
final String result = matcher.replaceAll(subst); 

System.out.println("Substitution result: " + result); 

Оригинальный текст :

"abcd","12345","success,1234,out",,"hai" 

трансформация: (с нулем)

"abcd","12345","success,1234,out","null","hai" 

Шаг № 2: (используйте REGEXP)

"([^"]*)" 

Результат:

abcd 
12345 
success,1234,out 
null 
hai 

Кредиты:
Эммануэль Guiton [https://stackoverflow.com/users/7226842/emmanuel-guiton] REGEXP

+0

Спасибо за ваш ответ. Я использую Talend и пытаюсь прочитать файл CSV Итак, есть ли способ получить полное регулярное выражение, чтобы получить все данные, включая NULL, т. Е. Я могу использовать t его регулярное выражение в качестве разделителя столбца при чтении текстового файла –

0

Вы можете также использовать функцию Replace:

final String inuput = "\"abcd\",\"12345\",\"success,1234,out\",,\"hai\""; 
System.out.println(inuput); 

String[] strings = inuput 
     .replaceAll(",,", ",\"\",") 
     .replaceAll(",,", ",\"\",") // if you have more then one null successively 
     .replaceAll("\",\"", "\";\"") 
     .replaceAll("\"\"", "") 
     .split(";"); 

for (String string : strings) { 

    String output = string; 
    if (output.isEmpty()) { 
     output = null; 
    } 

    System.out.println(output); 
} 
Смежные вопросы