Разбор строки CSV при помощи RegExp

Опубликовал Евгений (Berrimor) в раздел Программирование - Практика программирования

Вроде бы все просто, пока не встретилось что-то наподобие "111;111""";111

Может быть кому и пригодится, в готовом виде я подобного на сайте не нашел

Перем РегВыр;

//*******************************************
Функция глРазложить_CSV(Знач Стр) Экспорт
    Рез = СоздатьОбъект("СписокЗначений");

    Matches = РегВыр.Execute(Стр);
    Для СчетчикЦикла = 0 По Matches.Count()-Цикл
        Match = Matches.Item(СчетчикЦикла);
        Рез.ДобавитьЗначение(Match.Value);
    КонецЦикла;

    Возврат Рез;
КонецФункции

//*******************************************
Процедура ПриОткрытии()
    Попытка
        РегВыр  = СоздатьОбъект("VBScript.RegExp");
        РегВыр.IgnoreCase = 1;
        РегВыр.Global      = 1;
        РегВыр.Multiline  = 1;
        РегВыр.Pattern      = "(""([^""]*|""{2})*""(;|$))|""[^""]*""(;|$)|[^;]+(;|$)|(;)";
    Исключение
        Сообщить("Неудачная попытка создания ""VBScript.RegExp""","!!");
        СтатусВозврата(0);
    КонецПопытки;
КонецПроцедуры

См. также

Добавить вознаграждение
Комментарии
1. Алексей Константинов (alexk-is) 6075 27.05.10 06:22 Сейчас в теме
2. Евгений Люлюк (Evg-Lylyk) 1993 27.05.10 16:12 Сейчас в теме
Гуд работает! я не смог (в свое время) сделать.
Только для строки:
"";;14;121
2-го элемента нет
Еще желательно замерять скорость, а то может встроенным языком быстрее (читаемость регуляра на нуле)

Вот публикации в тему:
Использование регулярных выражений (RegExp) в 1С8.х
Экспорт ТЗ в CSV формат
(1) идея норм. Ссылки по поиску конечно стоило добавить.
3. Артур Аюханов (artbear) 847 03.06.10 16:14 Сейчас в теме
(0) Цикл
Для СчетчикЦикла = 0 По Matches.Count()-1 Цикл
Match = Matches.Item(СчетчикЦикла);
Рез.ДобавитьЗначение(Match.Value);
КонецЦикла;
очень медленный :(
посмотри обсуждение в http://infostart.ru/public/64222/
и мою статью Оптимизация типовых функций из кода 1С
4. Игорь Исхаков (Ish_2) 957 03.06.10 17:05 Сейчас в теме
(3) Смотри- ка в январе еще было. А я пропустил.
5. Евгений (Berrimor) 184 03.06.10 18:23 Сейчас в теме
(3) алгоритм для семерки -> без вариантов
6. Артур Аюханов (artbear) 847 04.06.10 13:04 Сейчас в теме
(5) А ты все-таки посмотри :)
у меня универсальный алгоритм, который подойдет и для 7-ки, и для 8-ки.
Один минус - нужна предварительная инициализация алгоритма, а она немного тормозная.
Так что для случая одной строки алгоритм проиграет, а вот если нужно проанализировать кучу строк, тогда выигрыш несомненен.
7. Сергей Шереметьев (ot.martina) 07.06.10 13:09 Сейчас в теме
А чем плох вариант:
СписокСтроки = СтрЗаменить(СтрокаСписка, ";", Символы.ПС);
Для Н = 1 По СтрЧислоСтрок(СписокСтроки) Цикл
ТекЗначение = СтрПолучитьСтроку(СписокСтроки, Н);
Н = Н + 1;
КонецЕсли;
8. Евгений (Berrimor) 184 09.06.10 09:12 Сейчас в теме
(7) тем что он не разберет конструкцию из анонса
9. Сергей Шереметьев (ot.martina) 15.06.10 18:37 Сейчас в теме
Согласен. Правда, предложенный метод тоже не разберет конструкцию из анонса.
10. Евгений (Berrimor) 184 16.06.10 12:52 Сейчас в теме
(9) анонс мною писан, что я балбес писать то что он не разберет :), будет

111;111""
111

что и нужно
Арчибальд; +1 Ответить 1
11. Сергей Шереметьев (ot.martina) 16.06.10 14:29 Сейчас в теме
Странно, почему у меня выдает такой текст?
"111;111""";
111
И как определить, что нужно не вот это?
"111
111"""
111
12. Евгений (Berrimor) 184 17.06.10 05:45 Сейчас в теме
(11) по моему Вам есть смысл разобраться с тем как устроен CSV
13. Сергей Шереметьев (ot.martina) 21.06.10 14:30 Сейчас в теме
Если Википедия - признаваемый авторитетным ресурс, то и Вам есть смысл с ним ознакомиться, особенно рекомендую завершающую часть:
CSV (от англ. Comma Separated Values — значения, разделённые запятыми) — это текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы. Значения отдельных колонок разделяются разделительным символом (delimiter) — запятая (,) или точка с запятой (;). Используемый символ разделителя зависит от установленной в системе локали. В США это запятая, а в России — точка с запятой, так как запятая используется для дробных чисел (в отличие от США, где это точка). Значения, содержащие зарезервированные символы, такие как: запятая, точка с запятой или новая строка обрамляются символом двойные кавычки ("); если в значении встречаются кавычки — они представляются в файле в виде двух кавычек подряд. Строки разделяются парой символов CR LF (0x0D 0x0A) (в DOS и Windows эта пара генерируется нажатием клавиши Enter).
То, что Вы пишете в (10) во-первых, не совпадает с результатом вывода 1С (см. (11)), во-вторых, не отвечает условию разбора CSV файла (см. описание использования зарезервированных символов и кавычек).
14. Евгений (Berrimor) 184 22.06.10 12:07 Сейчас в теме
была ситуевина, было решение - бодаться по поводу что есть csv смысла никакого не вижу, с сим всего доброго и желаю (13)
15. fzt fzt (fzt) 27.12.12 05:08 Сейчас в теме
(6) artbear,
По моему RegExp у меня подключен почти во всех конфигурациях, которые я так или иначе дорабатывал.
COM объект инициализируется один раз. Поскольку конфигурация в подавляющем большинстве случаев (кроме внешних и внутрненних collback вызовов) однопоточная то его хватает.