ФорумПрограммированиеPHP для идиотов → Regexp. CSV

Regexp. CSV

  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 16 октября 2010 г. 6:20, спустя 14 минут 53 секунды

    Регулярка намного намного дольше будет работать чем автомат (а тут и нужен то несложный)

    пруф
  • arvitaly

    Сообщения: 292 Репутация: N Группа: Адекваты

    Spritz 16 октября 2010 г. 6:25, спустя 4 минуты 55 секунд

    Ну насколько я понимаю регулярка будет сравнивать каждый кусок исходного текста на соответствие, т.е. передвигаясь на 1 символ. Пруф щас нет время искать
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 16 октября 2010 г. 6:32, спустя 6 минут 56 секунд

    Откуда вы это понимаете и почему конечный автомат на интерпретируемом языке будет быстрее?
  • arvitaly

    Сообщения: 292 Репутация: N Группа: Адекваты

    Spritz 16 октября 2010 г. 6:38, спустя 6 минут 14 секунд

    Откуда вы это понимаете и почему конечный автомат на интерпретируемом языке будет быстрее?

    Мне так кажется.
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 16 октября 2010 г. 7:06, спустя 27 минут 22 секунды

    будет работать быстрее?

    не буду. Мне это говорили, но у меня подозрение, что это херня все. Надо проверять.
    Тут удлбней и проще юзать експлод. Тут получается большая регулярка. Не люблю такие.
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 16 октября 2010 г. 7:11, спустя 5 минут 9 секунд

    arvitaly, ты ошибаешся. если она в принципе сумеет, то будет значительно быстрее, чем посимвольный разбор на PHP.

    SpartakuS, я не идиот и про explode слышал
    ιιlllιlllι унц-унц
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 16 октября 2010 г. 7:10, спустя 23 часа 59 минут 24 секунды

    хотя тут еще и экранирование кавычками вводить. Это тож не особо приятно на к.а.
  • arvitaly

    Сообщения: 292 Репутация: N Группа: Адекваты

    Spritz 16 октября 2010 г. 8:01, спустя 51 минуту 4 секунды

    <?php 

    error_reporting(-1);

    $line = '12,"153"",2",3,4,23,6';

    $csv_regex = '{
    \G(?:^|\s*,\s*)
    (?:
    # Поле в кавычках…
    " # открывающая кавычка
    ( [^"]*+ (?: "" [^"]*+ )*+ )
    " # закрывающая кавычка
    | # …или…
    # …произвольный текст, кроме кавычек и запятых…
    ( [^",]*[^",\s] )
    )
    }x';

    header('Content-type: text/plain');

    /* Применить регулярное выражение, заполнить $all_matches всеми типами данных
    */
    preg_match_all($csv_regex, $line, $all_matches);
    /* В $Result будут храниться поля, которые мы извлечем из $all_matches */
    $Result = array ();
    /* Обойти все успешные совпадения… */
    for ($i = 0; $i < count($all_matches[0]); $i++)
    {
    /* Если это совпадение со второй парой сохраняющих скобок - использовать
    * значение как есть */
    if (strlen($all_matches[2][$i]) > 0)
    array_push($Result, $all_matches[2][$i]);
    else
    {
    /* Если это значение в кавычках, предварительно заменить
    * последовательности из двух кавычек одной кавычкой */
    array_push($Result, preg_replace('/""/', '"', $all_matches[1][$i]));
    }
    }
    /* Теперь массив $Result заполнен и готов к дальнейшему использованию */

    var_export($Result);


    на раз быстрее
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 16 октября 2010 г. 8:03, спустя 2 минуты 16 секунд

    может всё-таки с регуляркой немного потанцуем?

    экранированные данные регулярка не сожрет, либо будет пиздечки сложной неподдерживаемой так сказать, чисто за прикол - да, можно было бы погонять, но обломно :D

    лучше пойду вставку vk.com видео на пыху сделаю, полезнее будет
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 16 октября 2010 г. 8:25, спустя 21 минуту 44 секунды


    $csv_regex = '{
    \G(?:^|,)
    (?:\s*+)
    (?:
    # Поле в кавычках…
    " # открывающая кавычка
    ( [^"]*+ (?: "" [^"]*+ )*+ )
    " # закрывающая кавычка
    | # …или…
    # …произвольный текст, кроме кавычек и запятых…
    ( [^",\s]*+ )
    )
    (?:\s*+)
    }x';
    [/php]
    Спустя 81 сек.
    [b]phpdude[/b], всё она сожрёт. надо только правильно написать
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 16 октября 2010 г. 8:34, спустя 8 минут 48 секунд

    artoodetoo, давно регулярки знаешь?)
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 16 октября 2010 г. 8:43, спустя 8 минут 54 секунды

    Я ламо пока что ) Вот книжку прочитаю, буду умный.
    ιιlllιlllι унц-унц
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 16 октября 2010 г. 9:45, спустя 1 час 2 минуты 2 секунды

    хм, и это всё ради разбора csv? что сделал бы я
    знал бы регулярку и пох на скорость - разбирал бы регуляркой
    не знал бы регулярки и пох на скорость - разбирал бы в цикле
    не пох на скорость - поставил бы 5.3 и использовал str_getcsv
    нет возможности 5.3 - использовал бы предварительную запись в файл + fgetcsv (для больших объёмов)
    не всё полезно, что в swap полезло
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 16 октября 2010 г. 9:55, спустя 10 минут 23 секунды

    Что делаю я: выбираю метод достижения цели, пишу тест и пытаюсь добиться результата. Если результат не устраивает, оцениваю альтернативы. Если они не устраивают, стараюсь грамотно сформулировать вопрос обществу. Если общество обосралось, выбираю то, что не нравится, но работает и возвращаюсь к п.1
    Спустя 41 сек.
    P.S. Регулярки меня устраивают.
    ιιlllιlllι унц-унц
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 16 октября 2010 г. 11:31, спустя 1 час 36 минут 7 секунд

    artoodetoo, а мне больше нравится вариант с fgetcsv. проще как-то, и без тестов можно обойтись
    не всё полезно, что в swap полезло

Пожалуйста, авторизуйтесь, чтобы написать комментарий!