Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Парсинг строки из Excel, как определить конец строки?
Форумы портала PHP.SU » PHP » Регулярные выражения » Парсинг строки из Excel, как определить конец строки?

Страниц (1): [1]
 

1. kisil-mike - 31 Мая, 2018 - 22:52:51 - перейти к сообщению
Необходимо сделать на странице сайта <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. Строитель - 31 Мая, 2018 - 23:35:07 - перейти к сообщению
kisil-mike пишет:
Возможно str_getcsv() поможет?
Попробуйте. А если не поможет, то можно попробовать вместо explode() решение с preg_split():
PHP:
скопировать код в буфер обмена
  1. $str = 'ячейка1 \t ячейка2 \t "ячейка3 \r\n ячейка3 часть2" \r\n
  2. ячейка1 \t ячейка2 \t "ячейка3" \r\n';
  3.  
  4. $arr = preg_split('~\r\n~', $str);
  5.  
  6. var_dump($arr);
В результирующем массиве вы получите две строки:
CODE (html):
скопировать код в буфер обмена
  1. array (size=2)
  2.   0 => string 'ячейка1 \t ячейка2 \t "ячейка3 \r\n ячейка3 часть2" \r\n' (length=85)
  3.   1 => string 'ячейка1 \t ячейка2 \t "ячейка3" \r\n' (length=54)
3. kisil-mike - 31 Мая, 2018 - 23:53:12 - перейти к сообщению
В общем, сам PHP с помощью fgetcsv() отлично парсит скопированное из excel, только ему нужно скармливать файл, поэтому решение такое - создаем временный файл, записываем в него данные и парсим как CSV

CODE (htmlphp):
скопировать код в буфер обмена
  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. }

 

Powered by ExBB FM 1.0 RC1