Forum Webscript.Ru

Программирование => Perl => Тема начата: Evgeny от 25 Февраля 2003, 15:36:44

Название: Знатокам регулярных выражений
Отправлено: Evgeny от 25 Февраля 2003, 15:36:44
А знает кто-нибудь шаблона для ф-ции split, чтобы правильно разбить csv-строку.

Например это "a""a;a";"b""""b;b";""";"";" должно так разбиваться:
$a[0]:  a"a;a
$a[1]:  b""b;b
$a[2]:  ";";

А вот можно ли такое с помощью одного шаблона сделать?(я имею ввиду без того, чтобы дополнительно ещё раз строку проходить-просматривать и т.п.)
Название: Знатокам регулярных выражений
Отправлено: NeoNox от 25 Февраля 2003, 15:45:43
@a = split(\'\\";\\"\', $text); ?
Название: Знатокам регулярных выражений
Отправлено: Chs от 25 Февраля 2003, 16:51:03
NeoNox, он имел в виду, что точка с запятой экранируется кавычками.

Я бы сделал проходом строки по символу в цикле считая кавычки - т.е. если кавычки открыты не разбивать по  \';\', а если закрыты - то выделить с пред. \';\' по substr.
Ну и конечно есть
Text::CSV и DBD::CSV - можно посмотреть как они написаны.
Название: Знатокам регулярных выражений
Отправлено: NeoNox от 25 Февраля 2003, 17:12:12
Цитировать
Ну и конечно есть
Text::CSV и DBD::CSV

Я с DBD::CSV когда-то работал.
Там с "левым" форматом csv лучше не подходить.
В любом случае ему sep_char нужно задавать.
Название: Знатокам регулярных выражений
Отправлено: NeoNox от 25 Февраля 2003, 17:28:21
Вот это я, кстати, не понял, почему в первом случае нет \';\' а во втором есть?
$a[0]: a"aa
$a[1]: b""b;b
Название: Знатокам регулярных выражений
Отправлено: Evgeny от 25 Февраля 2003, 18:08:15
NeoNox
Цитировать
Вот это я, кстати, не понял, почему в первом случае нет \';\' а во втором есть?
$a[0]: a"aa
$a[1]: b""b;b

Сорри, сейчас исправлю вверху.

Кавычка экранируется кавычкой, т.е. a"a  -> a""a
А если в поле содержится ; то всё поле заключается в кавычки:
a;a  -> "a;a"
Соединяем всё вместе и получаем:
b""b;b -> "b""""b;b"