За последние 24 часа нас посетили 21855 программистов и 988 роботов. Сейчас ищут 680 программистов ...

Парсинг строки из Excel, как определить конец строки?

Тема в разделе "Регулярные выражения", создана пользователем supermike, 31 май 2018.

  1. supermike

    supermike Активный пользователь

    С нами с:
    4 фев 2015
    Сообщения:
    8
    Симпатии:
    0
    Необходимо сделать на странице сайта <textarea>, в которую можно было бы вставить скопированные из excel(через выделение + ctrl+c) данные и получить из этого в PHP данные в виде массива [строка1[ячейка1,ячейка2,..], строка2[ячейка1,..]]

    Столкнулся с проблемой: в некоторых excel ячейках встречаются символы переноса строки. В таких случаях excel ячейку обрамляет кавычками. Как мне определить где кончается строка 1 и начинается строка 2 в таком случае?

    Сами ячейки разделены между собой табуляцией, строки - символами \r\n, соответственно в обычном случае массив я создавал путем деления на строки через explode("\r\n"), а затем делением строки на ячейки через explode("\t"). А вот как быть когда внутри ячейки встречается те же \r\n... нужно как-то учитывать кавычки.

    Т.е. собственно вот пример строки которую я получаю в textarea(для наглядности вставил спецсиволы \t и \r\n, на самом деле они невидимы)
    ячейка1 \t ячейка2 \t "ячейка3 \r\n ячейка3 часть2" \r\n
    ячейка1 \t ячейка2 \t "ячейка3" \r\n

    Как мне спарсить первую строку? Возможно str_getcsv() поможет?
     
  2. username

    username Новичок

    С нами с:
    6 июл 2017
    Сообщения:
    225
    Симпатии:
    17
    скорее всего стоит посмотреть на функции и классы для работы с csv
     
  3. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    @supermike, пробуйте плагин Papa Parse. Попробовал на демо-странице - всё разбирает, как нужно.
    --- Добавлено ---
    P.S. Слегка заработался сегодня на фронтенде. Если вам нужно решение на PHP, то разбирайте данные, как CSV. Только разделитель - TAB
     
    supermike нравится это.
  4. supermike

    supermike Активный пользователь

    С нами с:
    4 фев 2015
    Сообщения:
    8
    Симпатии:
    0
    Спасибо за ссылку, решение на JS тоже пригодится. В общем, пришел к такому решению. Сам PHP с помощью fgetcsv() отлично парсит скопированное из excel, только ему нужно скармливать файл, поэтому решение такое - создаем временный файл, записываем в него данные и парсим как CSV

    Код (Text):
    1. <form method="post">
    2.     <textarea name="data"></textarea>
    3.     <input type="submit">
    4. </form>
    5. <pre>
    6. <?php
    7. if(!empty($_POST['data'])) {
    8.     $temp = tmpfile();
    9.     fwrite($temp, $_POST['data']);
    10.     fseek($temp, 0);
    11.  
    12.     while (($data = fgetcsv($temp, 1000, "\t")) !== FALSE) {
    13.         print_r($data);
    14.     }
    15. }
     
    #4 supermike, 1 июн 2018
    Последнее редактирование: 1 июн 2018
  5. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Ещё вариант.
    PHP:
    1. $text = "ячейка1 \t ячейка2 \t \"ячейка3 \r\n ячейка3 часть2\"\r\n".
    2.         "ячейка1 \t ячейка2 \t \"ячейка3\" \r\n";
    3.  
    4. $file = new SplFileObject('data://text/plain,'.$text);
    5. while (!$file->eof()) {
    6.     $data = $file->fgetcsv("\t");
    7.     print_r($data);
    8. }
     
    supermike нравится это.
  6. supermike

    supermike Активный пользователь

    С нами с:
    4 фев 2015
    Сообщения:
    8
    Симпатии:
    0
    @Emilien
    Интересное решение, спасибо!
    Никогда раньше не использовал ни SplFileObject ни конструкцию data://, много нового узнал.
    Получается в моем скрипте можно не создавать tmp файл, и вместо конструкции
    Код (Text):
    1. $temp = tmpfile();
    2. fwrite($temp, $_POST['data']);
    3. fseek($temp, 0);
    написать просто
    Код (Text):
    1. $temp = fopen('data://text/plain,'.$_POST['data'], 'r');