2014-11-07 2 views
0

При такой формат данных одной строки в CSV-файле:Извлечение данных из конкретного формата CSV файлов

'data(g1),data(g1)','data(g2),data(g2),data(g2),,,',,,'data(g5),,,data(g5)', 

Это находится в формате CSV, но для отдельной группы данных, использовать

'' 

группировать их, как:

.....'data(g2),data(g2),data(g2),,,'.... 

Но есть такие неловкие ситуации: ряд может пропустить некоторые группы, и для группы, он может пропустить некоторые поля. Но для всей недостающей части она все еще использует запятую, чтобы отделить их. Таким образом, каждая строка всегда будет иметь 6 групп данных. Тогда как я могу получить все 6 групп данных правильно (даже в нем нет ничего)?

Я пытаюсь использовать регулярные выражения, как это:

String row = <the above data row>; 
String[] dataGroups = row.split(','); 

Но это один определенно не будет работать, так как в каждой группе данных, также использовать запятую для разделения данных. Какие-нибудь эффективные способы использования Java? Это будет удивительным, если я могу иметь все 6 групп данных, хранящихся в

String[] dataGroups 

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

+1

Любая причина, по которой вы не используете одну из библиотек Csv (https://sourceforge.net/projects/opencsv/) или (https://sourceforge.net/projects/supercsv/?source=directory) ?? ?. Возможно, эти библиотеки могут обрабатывать формат –

+0

. Я не думаю, что это помогает. – byteBiter

+1

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

ответ

1

Hm. Как насчет регулярного выражения?

('.*')?,('.*')?,('.*')?,('.*')?,('.*')?,('.*')? 

Это некрасиво, но он может работать правильно ...

Per http://www.regular-expressions.info/java.html, вы могли бы сделать что-то вроде этого:

Matcher m = Pattern.compile("('.*')?,('.*')?,('.*')?,('.*')?,('.*')?,('.*')?").matcher(row); 
m.find(); 
m.group(1); //gives you the first group on the line; 
//change the index to get the other groups 

Вы могли бы затем разделить каждую группу с .split(',')

Настоящая версия: http://regex101.com/r/jR0iM4/1

+0

, можете ли вы указать, как использовать это? Лучше показать некоторые коды – byteBiter

+0

Помогает ли это объяснить это? –

+0

Ну, это просто группировать эти поля с '' '', но оно не захватило пустое поле. – byteBiter

0

Является ли ваш формат файла достаточно надежным, чтобы иметь «только как начало и начало группы данных? Затем вы можете удалить «в начале и в конце строки, а затем проливать строку на«, »(три символа) вместо просто запятой.

+0

Вопрос в том, что это не настраивается, его нельзя настроить на ', '', '',' – byteBiter

+0

Я думал о 'данных (g1), данных (g1)', 'данных (g2), данных (g2), данные (g2) ,,, ,,, данные (g5) ,,, данные (g5) '---> данные (g1), данные (g1)', 'данные (g2), данные (g2), данные (g2) ,,, ',,,' data (g5) ,,, data (g5), а затем это можно разделить на «,», находящееся между группами –

0

Я думаю, что это становится проблемой санитарии. Все строки начинаются и начинаются с одиночной кавычки (').

Если да, то вы можете сделать следующее:

  1. Получить все содержимое в кавычки с помощью регулярных выражений.
  2. Затем для каждой строки разделите на столбцы, разделив запятую.
  3. Затем запишите разделенные группы в список>, где внешний список - это строки, а вложенные списки - это столбцы.
  4. Затем можно настроить это запятых ближе к концу, если вложенная список не является размер 6.

На мой взгляд, это чище читать и потреблять.

+0

Я могу получить весь существующий контент с помощью кавычек через регулярное выражение, но это означает, что я могу потерять группу без содержимого. Мне нужно захватить его, даже если это «нулевая» группа, потому что позиция каждой группы важна для меня. Если содержание группы 4 отсутствует, я получу 5 групп содержимого, но как я могу узнать, какой из них отсутствует? Порядок групп имеет решающее значение. – byteBiter

+0

Пустые группы будут представлены даже как ''. В противном случае, откуда вы знаете, чего не хватает? – kuriouscoder

-1

В соответствии с одним из ваших комментариев, вы должны проанализировать это:

....,'data(gn),data(gn),subdata='datavalue',data(gn),,',..... 

Только парсер CSV в uniVocity-parsers может разобрать, что. У вашего ввода есть неопределенные кавычки внутри указанного значения. Это нарушит любую другую библиотеку синтаксического анализа CSV для Java (не стесняйтесь попробовать).

Что у вас есть похож на это:

something,"text with "unescaped quotes" here",something else 

Вы хотите, чтобы это как выход:

something 
text with "escaped quotes" here 
something else 

Вам просто нужно бросить свой вклад в однозначности-парсер CSV парсер

CsvParserSettings parserSettings = new CsvParserSettings(); 
parserSettings.setParseUnescapedQuotes(true); //this is enabled by default 

CsvParser parser = new CsvParser(parserSettings); 
List<String[]> allRows = parser.parseAll(getReader("/examples/bean_test.csv")); 

Подробнее об этой функции here.

Раскрытие информации: Я являюсь автором этой библиотеки. Это бесплатно и бесплатно (лицензия Apache V2.0).

Смежные вопросы