CSV/TSV-формат и PHP

Я люблю Excel - править огромные таблицы, быстро анализировать данные в нём одно удовольствие. Для того, чтобы обработанные данные передать в приложения на CakePHP, я просто копирую всё в буфер и вставляю в textarea. Чтобы разбирать информацию оттуда, я использую

PHP:
  1. $rows = tsv_array($this->data['ModelName']['textarea_field']);

А вот и сама функция для разбора TSV.

PHP:
  1. /**
  2. * Convert TSV to array
  3. *
  4. * @param string $s TSV
  5. * @param bool/array $keys
  6. *  false - don't modify headers
  7. *  true - use first row as headers
  8. *  array - use it as headers
  9. * @return array
  10. */
  11. function tsv_array($s, $keys=false, $delimiter="\t") {
  12.     $rows = explode("\n", r("\r", '', trim($s)));
  13.  
  14.     $min = null;
  15.     $max = null;
  16.     foreach ($rows as &$row) {
  17.         $row = array_map('trim', explode($delimiter, $row));
  18.        
  19.         $count = count($row);
  20.         if ($min===null || $count<$min) {
  21.             $min = $count;
  22.         }
  23.         if ($max===null || $count>$max) {
  24.             $max = $count;
  25.         }
  26.     }
  27.     unset($row);
  28.     if ($max!=$min) {
  29.         foreach ($rows as &$row) {
  30.             for ($i=count($row); $i<=$max; $i++) {
  31.                 $row[] = false;
  32.             }
  33.         }
  34.         unset($row);
  35.     }
  36.    
  37.     if (!$keys) return $rows;
  38.    
  39.     if ($keys===true) {
  40.         $keys = array_shift($rows);
  41.     }
  42.    
  43.     $result = a();
  44.     foreach ($rows as $row) {
  45.         $item = a();
  46.         for ($i=0; $i<count($row); $i++) {
  47.             if (!isset($keys[$i])) continue;
  48.            
  49.             $item[$keys[$i]] = $row[$i];
  50.         }
  51.         $result[] = $item;
  52.     }
  53.    
  54.     return $result;
  55. }

Для понимания CSV надо просто передавать другой $delimiter. Функция специально упрощена - по правильному надо ещё проверять на обрамление двойными кавычками - тогда допускается перенос строки внутри значений.


Понравилось?

  1. Подпишись через RSS
  2. Расскажи о http://php.southpark.com.ua друзьям.
    Все способы хороши: ICQ, E-mail, свой блог, комментарий в чужом блоге или сообщение на форуме
  3. Добавь статью на news2.ru, Хабрахабр или в закладки

Огромное спасибо!

И не стесняйтесь комментировать - у меня стоит плагин, который убирает rel="nofollow" у людей, которые написали больше 5 комментариев.

RSS feed | Trackback URI

4 комментария »

Comment by keris Subscribed to comments via email
2009-06-23 08:47:22

Может подскажешь, что нужно для использования(обработки, импорта) CSV файлов? Я имею ввиду какие модули или расширения php или perl должны быть установлены на хостинге

2009-09-09 11:41:56

Чтобы использовать функцию, описанную в этом посте - нужен только PHP.

 
 
Comment by Константин
2009-11-05 06:15:17

Есть база данных в виде кучи скачанных PHP-файлов. Возможно всё это объединить в Excel? За работу заплачу.

 
Comment by Константин
2009-11-05 06:20:28

Есть база данных в виде кучи скачанных PHP-файлов. Можно всё это объединить в Excel? За работу заплачу.

 
Имя (required)
E-mail (required - never shown publicly)
URL
Текст комментария
You may use <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> in your comment.