Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2017, 14:05   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Регулярные выражения (опять, теперь уже в C#)

Здравствуйте.
Задача такая: разбить строку на составляющие, которые имеют следующий формат:
"<любой набор символов>" (фрагменты, заключённые в кавычки).
Вооружился следующими инструментами: синтаксис регулярных выражений, чем сплитить.

Пишу код:
Код:
arr=Regex.Split(inputStr,"\".+\"");
Получаю хрень. Пробовал различные варианты со скобками, слэшами, и прочие вариации - результата никакого.
Собственно, регулярки - это моё больное место (как и многое другое =) ), но я потихоньку начинаю вникать.

Я конечно же могу пойти другим путём - просто Split("\""), и обработать, но вся эта хрень с регулярками "кидает мне вызов" (с которым я не справляюсь =) ), поэтому пытаюсь хотя бы узнать, как это делать.

Помогите пожалста.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 25.10.2017 в 14:08.
OmegaBerkut вне форума Ответить с цитированием
Старый 25.10.2017, 14:12   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Код:
"\".+?\""
И наверно не Split, а просто поиск нужен?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 25.10.2017, 14:16   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
И наверно не Split, а просто поиск нужен?
Нужно разбить на куски, и обработать каждый кусок по отдельности.
Суть в том, что у меня файл формата CSV, и на выходе не должно быть никаких кавычек; в одном из нескольких файлов они таки присутствуют, просто потому что разделитель (точка с запятой) используется в некоторых ячейках; отсюда все мои артефакты и проблемы.
Нужно в каждой ячейке в кавычках найти и заменить (Replace) все разделители, что бы все кавычки благополучно удалить без повреждения количества ячеек в каждой строке файла.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 25.10.2017, 15:55   #4
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Нда, файл на 400 000 строк, и такая поячеистая обработка в один поток будет длиться час =) ...
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 25.10.2017, 16:21   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Насколько помню это с 1С выгрузка. Может проще в dbf выгрузить из таблицы значений или вообще в текстовый файл c фиксированной структурой. Объем увеличится конечно, но обработка упростится.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.10.2017, 16:33   #6
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Насколько помню это с 1С выгрузка. Может проще в dbf выгрузить из таблицы значений или вообще в текстовый файл c фиксированной структурой. Объем увеличится конечно, но обработка упростится.
Не всё так просто =)
У меня помимо собственной выгрузки из 1С (где кстати с форматом всё в порядке) есть ещё десяток таких выгрузок из пойди пойми откуда.
И вот попались такие артефакты, при которых мало того что разделители в ячейках, так ещё и не все ячейки взяты в кавычки. Как обрабатывать такие ситуации - я имею очень смутное представление ...
Если сначала разбить по разделителям - то я уже сразу получаю дополнительные "столбцы", если же сначала разбивать по кавычкам - я получаю одну ячейку строки, в которой судя по разделителям и по общей массе данных должно быть две или три (ячейки).
Подчёркнутое довольно таки сложно алгоритмизировать, и в плане реализации, и в плане оптимизации выполнения.
Эксель поступает просто: если есть кавычки - всё грузит по кавычкам, иначе же - по разделителям. Это я вижу, когда открываю подопытный файл в том самом экселе.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 25.10.2017 в 16:42.
OmegaBerkut вне форума Ответить с цитированием
Старый 25.10.2017, 17:29   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Что значит не все?
Вроде бы обычно так и есть в CSV, кавычки только если в ячейке есть разделитель.
https://en.wikipedia.org/wiki/Comma-separated_values

Зачем вы боретесь с форматом вместо следования ему?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 25.10.2017 в 17:32.
Alex11223 вне форума Ответить с цитированием
Старый 25.10.2017, 23:56   #8
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Что значит не все?
Вроде бы обычно так и есть в CSV, кавычки только если в ячейке есть разделитель.
https://en.wikipedia.org/wiki/Comma-separated_values

Зачем вы боретесь с форматом вместо следования ему?
Я не с форматом борюсь ... Статью читал.
У меня один файл, в котором НЕ ВСЕ ячейки таблицы взяты в кавычки. Делаю его не я, а качаю там, где мне сказали качать.

На сколько мне известно, формат данных должен быть одинаковым в пределах одного файла (блин, масло маслянное), что бы обрабатывалось нормально.
Если нужно использовать разделитель хотя бы в одной ячейке таблицы, то ВСЕ ячейки таблицы должны идти в кавычках (и только после разделяться разделителями).
А табуляция для слабаков (это более универсальный символ).

Поправьте меня, если я не прав, и объясните пожалуйста, как программа должна воспринимать различие ?
Повторю: если сначала делить по разделителям - то при их наличии в "одной ; ячейке" я получаю разбиение ячейки НЕЗАВИСИМО ОТ ТОГО, есть ли кавычки вообще. Если есть кавычки - тогда нужно сначала разбить по кавычкам, отсеять внешние разделители, и дальше работать уже с ячейками; в таком случае - если есть ячейка, которую не взяли в кавычки - это ещё пол беды, будет хвост, который со скрипом запишется как ОДНА ячейка; но если это НЕ ОДНА ячейка (разделители есть, кавычек нет) - как тогда поступать ?
Эксель воспринимает это, как одну ячейку. Но взглянув на другие строки можно увидеть, что это не так.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 26.10.2017 в 00:23.
OmegaBerkut вне форума Ответить с цитированием
Старый 26.10.2017, 00:14   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Не должен, зачем?
В Экселе работает нормально.

Ну и с CSV основная сложность, что не все программы придерживаются одного стандарта.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 26.10.2017, 00:23   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Такая может регулярка нужна?
Код:
\".+?\"
фишка в том, что по-умолчанию регулярки жадные и жрут символы по максимуму, поэтому \".+\" захватит всё, что между первой и последней кавычкой, а с ? будут браться ближайшие кавычки.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Опять регулярные выражения polin11 Общие вопросы C/C++ 4 09.08.2017 09:05
Опять регулярные выражения polin11 Python 1 07.08.2017 06:29
И опять Dispather Famework, теперь с cms. Оцените :) dem66 PHP 24 26.04.2012 21:12
Опять авторизация, но теперь сессии Che Guevara PHP 5 29.11.2010 12:55
Опять сумма. Теперь при условии jungo Microsoft Office Excel 11 07.05.2008 09:38