Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) как разобрать CSV RegExp-ами (число прочтений - 4654 )
sashas09
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Местоположение: Киев
Зарегистрирован: 26. Апреля 2007
Пол: Мужской
как разобрать CSV RegExp-ами
25. Сентября 2009 :: 10:28
Печать  
Есть CSV файл содержащий ~30000 записей
нуна его разобрать по полям и частично втянуть в 1с

обнаружилась проблема
Excel при импорте поля "INDEX" ( да и "OKPO")  "съедает" ведущие
нули (воспинимая эти поля как цифровые, хотя само поле окружено кавычками.
Ручной импорт с явным указанием типа поля ситуации не исправил.

Хочется (горит, как всегда) разобрать файл - наверное RegExp-ами.
А проблемка - не работал с регулярными выражениями.
Мож кто работал и даст шаблон разбора?
разделитель - точка с запятой

  
Наверх
ICQ  
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: как разобрать CSV RegExp-ами
Ответ #1 - 25. Сентября 2009 :: 10:53
Печать  
до чего лень людей доводит О_о
ищи/пиши: Функция глСтрокаВСписок(...)
  
Наверх
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: как разобрать CSV RegExp-ами
Ответ #2 - 25. Сентября 2009 :: 11:09
Печать  
Выложи CSV зазипованный. Помогу наверное.
  
Наверх
 
IP записан
 
sashas09
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Местоположение: Киев
Зарегистрирован: 26. Апреля 2007
Пол: Мужской
Re: как разобрать CSV RegExp-ами
Ответ #3 - 25. Сентября 2009 :: 11:16
Печать  
trdm писал(а) 25. Сентября 2009 :: 10:53:
до чего лень людей доводит О_о
ищи/пиши: Функция глСтрокаВСписок(...)


ну-ну...
дык учитываем, что в поле может быть разделитель внутри поля?

...;" тел. xx-xx-xx; тел yy-yy...";55;"ТОВ ""Рога и копыта""";......

ну-тко набросай по скорому глСтрокаВсписок  Очень довольный
  
Наверх
ICQ  
IP записан
 
sashas09
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Местоположение: Киев
Зарегистрирован: 26. Апреля 2007
Пол: Мужской
Re: как разобрать CSV RegExp-ами
Ответ #4 - 25. Сентября 2009 :: 11:19
Печать  
выкладываю
тут первых 23 строки
  

11.zip ( 4 KB | Загрузки )
Наверх
ICQ  
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: как разобрать CSV RegExp-ами
Ответ #5 - 25. Сентября 2009 :: 12:13
Печать  
sashas09 писал(а) 25. Сентября 2009 :: 11:16:
trdm писал(а) 25. Сентября 2009 :: 10:53:
до чего лень людей доводит О_о
ищи/пиши: Функция глСтрокаВСписок(...)

ну-ну...
дык учитываем, что в поле может быть разделитель внутри поля?
...;" тел. xx-xx-xx; тел yy-yy...";55;"ТОВ ""Рога и копыта""";......
ну-тко набросай по скорому глСтрокаВсписок  Очень довольный


плевая задача, тривиальная. Че сам-то не можешь справиться?
Разбирай посимвольно с учетом "вхождения в строку".
пс. Не хочу писать, не такая задача сложная, что-бы думать за человека.
  
Наверх
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: как разобрать CSV RegExp-ами
Ответ #6 - 25. Сентября 2009 :: 12:34
Печать  
Написал:

Код
Выбрать все
(\d+(?=;))|(\d+[.\d]\d+(?=;))|(\d+[.\d]\d+[.\d]\d+(?=;))|("(([^"])|(""))*"(?=;)) 



Это регулярное выражение разбирает строку CSV-файла с учетом двойных кавычек и ";" которые могут быть в тексте.

Для примера строка:

Код
Выбрать все
109541;"Аптечный пункт 3  ; (Украина, ""Светловодск"")";"Аптечный пункт ;"Світловодськ";0;"Украина, Кировоградская обл., г.Светловодск, ул.Павлова Академика, 16, ЦРБ, поликлиника";16542;"3510900000";"СВЕТЛОВОДСК";30;"Аптечный пункт";"";9880;"Каскад ЧП ПКФ (Украина, Светловодск)";"Каскад";"Частное предприятие производственно-коммерческая фирма";"Светловодск";"13757383";4;"";"";0;"";2;"г.";"ул.";364;"Павлова Академика";"16, ЦРБ, поликлиника";"";81962;"АВ154111";31.05.2006;31.05.2011;34467;"Частная";0;0; 



Результат разбора:

Код
Выбрать все
109541
"Аптечный пункт 3  ; (Украина, ""Светловодск"")"
"Аптечный пункт 3"
""
"27500"
"27500"
2
"подписка"
118289
121
"Кировоградская"
560
"Светловодск"
"Світловодськ"
0
"Украина, Кировоградская обл., г.Светловодск, ул.Павлова Академика, 16, ЦРБ, поликлиника"
16542
"3510900000"
"СВЕТЛОВОДСК"
30
"Аптечный пункт"
""
9880
"Каскад ЧП ПКФ (Украина, Светловодск)"
"Каскад"
"Частное предприятие производственно-коммерческая фирма"
"Светловодск"
"13757383"
4
""
""
0
""
2
"г."
"ул."
364
"Павлова Академика"
"16, ЦРБ, поликлиника"
""
81962
"АВ154111"
31.05.2006
31.05.2011
34467
"Частная"
0
0 



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

Теперь подробнее:

Код
Выбрать все
(\d+(?=;)) - это числа без десятичных знаков
(\d+[.\d]\d+(?=;)) - это числа с десятичными знаками
(\d+[.\d]\d+[.\d]\d+(?=;)) - это даты
("(([^"])|(""))*"(?=;)) - это строки 

  
Наверх
 
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: как разобрать CSV RegExp-ами
Ответ #7 - 25. Сентября 2009 :: 12:59
Печать  
trdm писал(а) 25. Сентября 2009 :: 12:13:
плевая задача, тривиальная. Че сам-то не можешь справиться?
Разбирай посимвольно с учетом "вхождения в строку".
пс. Не хочу писать, не такая задача сложная, что-бы думать за человека.

Ага, и сколько интересно будет работать такой алгоритм посимвольного перебора при 30000 строк, учитывая что у него строка в среднем 500 символов? Это 15'000'000 символов получается. Регулярными выражениями получится быстрее раз в 100 как минимум.
  
Наверх
 
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: как разобрать CSV RegExp-ами
Ответ #8 - 25. Сентября 2009 :: 13:11
Печать  
Оптимизировал слегка:

Код
Выбрать все
([\d.]+(?=;))|("(([^"])|(""))*"(?=;)) 

  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: как разобрать CSV RegExp-ами
Ответ #9 - 25. Сентября 2009 :: 13:25
Печать  
maljaev писал(а) 25. Сентября 2009 :: 12:59:
trdm писал(а) 25. Сентября 2009 :: 12:13:
плевая задача, тривиальная. Че сам-то не можешь справиться?
Разбирай посимвольно с учетом "вхождения в строку".
пс. Не хочу писать, не такая задача сложная, что-бы думать за человека.

Ага, и сколько интересно будет работать такой алгоритм посимвольного перебора при 30000 строк, учитывая что у него строка в среднем 500 символов? Это 15'000'000 символов получается. Регулярными выражениями получится быстрее раз в 100 как минимум.

логично. Но лучшее - враг хорошего Улыбка
  
Наверх
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: как разобрать CSV RegExp-ами
Ответ #10 - 25. Сентября 2009 :: 13:38
Печать  
trdm писал(а) 25. Сентября 2009 :: 13:25:
логично. Но лучшее - враг хорошего Улыбка

Да, то-то вы прямыми запросами балуетесь вместо тупого перебора. Улыбка
  
Наверх
 
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: как разобрать CSV RegExp-ами
Ответ #11 - 25. Сентября 2009 :: 13:42
Печать  
Так, для тех кто хочет изучить регулярные выражения:

Здесь RegexBuddy (без него трудно что-то отладить): http://rs148.rapidshare.com/files/278882881/RGBUDY3.4.0.rar

А в аттаче краткое документалово к регулярным выражениям.
  

regexp.zip ( 32 KB | Загрузки )
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: как разобрать CSV RegExp-ами
Ответ #12 - 25. Сентября 2009 :: 14:09
Печать  
А тут Пример работы с регулярными выражениями в 1С
Который поможет прямо в 1С:Предприятии поиграться с регулярками Улыбка
Ну и приатачу заодно..
  

vbscriptregexpin_001.zip ( 28 KB | Загрузки )
Наверх
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: как разобрать CSV RegExp-ами
Ответ #13 - 27. Сентября 2009 :: 12:07
Печать  
Попробуй awk - это узкоспециализированный инструмент как раз для таких задач.
И со скоростью у него все тип-топ.
  
Наверх
www  
IP записан
 
sashas09
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Местоположение: Киев
Зарегистрирован: 26. Апреля 2007
Пол: Мужской
Re: как разобрать CSV RegExp-ами
Ответ #14 - 27. Сентября 2009 :: 18:11
Печать  
Большое спасибо to maljaev

Усё получилось ....
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать