Php csv


Обычно, если стоимость создания интернет магазина достаточно высока или имеет большое количество товаров, заказчики просят сделать импорт товаров из их прайс листов. PHP как известно, не умеет работать с Excel-файлами стандартными средствами. Конечно есть множество различных классов и библиотек, которые могут читать и записывать информацию в Excel, но с ними возникает достаточно много проблем и неудобств. Гораздо проще и удобнее работать с CSV-файлами. Предлагаю разобрать простой способ чтения и записи данных в CSV-файл средствами PHP.

Как Вы знаете, CSV — текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы. Значения отдельных колонок разделяются разделительным символом — обычно запятой (,).

Как это работает?

Пример записи данных

Первым делом мы формируем двумерный массив значений $list. Функция fopen()закрепляет именованный ресурс, указанный в аргументе filename, за потоком, а также указываем режим работы с файлом. Со списком режимов работы с файлом Вы можете ознакомиться в конце статьи.


Запись в файл производится построчно, поэтому имея двумерный массив мы вызываем функцию записи fputcsv() в цикле.Функция fputcsv() форматирует строку (переданную в виде массива) в виде CSV и записывает её (заканчивая переводом строки) в указанный файл. Как видите, в этой функции мы указываем файл $fp, в который производим запись, строку $fields, которая содержит значения полей, а также такие параметры, как разделитель полей (в нашем случае это точка с запятой) и ограничитель полей (у нас это двойная кавычка).

После окончания записи, не забываем закрывать дескриптор файла fclose().

Пример чтения данных

С помощью функции fopen() мы пытаемся открыть файл для чтения и, если он есть, построчно заполняем массив данными с помощью функции fgetcsv(). Функция fgetcsv() читает строку из файла и производит разбор данных CSV. Данная функция похожа на функцию fgets(), с той разницей, что она производит анализ строки на наличие записей в формате CSV и возвращает найденные поля в качестве массива. В эту функцию мы передаем такие параметры как корректный файловый указатель на успешно открытый файл, длину строки (обычно указывается длина большая самой длинной строки в файле, в нашем случае мы указываем 0, т.е. длина не ограничена), а также разделитель поля (т.к. в примере для записи мы использовали точку с запятой, то и для чтения будем использовать её).


И опять же, после выполнения чтения из файла не забываем закрывать дескриптор файла fclose().

Список возможных режимов для fopen()

‘r’ — Открывает файл только для чтения; помещает указатель в начало файла.
‘r+’ — Окрывает файл для чтения и записи; помещяет указатель в начало файла.
‘w’ — Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длинны. Если файл не существует — пробует его создать.
‘w+’ — Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длинны. Если файл не существует — пробует его создать.
‘a’ — Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует — пробует его создать.
‘a+’ — Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует — пробует его создать.
‘x’ — Создаёт и открывает только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт FALSE и выдаст предупреждение уровня E_WARNING. Если файл не существует, пытается его создать.
‘x+’ — Создаёт и открывает для чтения и записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт FALSE и выдаст предупреждение уровня E_WARNING. Если файл не существует, пытается его создать.


Как видите, мы разобрали лишь теорию, но если вынести чтение из файла и запись в файл отдельными функциями, правильно организовать обработку ошибок, то можно реализовать неплохой функционал по импорту/экспорту товаров в свой интернет магазин с возможностью добавления новых товаров и обновления имеющихся. Самое главное, не забывайте про кодировку импортируемых/экспортируемых данных, а также правильно выбирайте разделитель поля, т.к. бывают ситуации, когда выбранный разделитель может встретиться просто в тексте, который Вы пытаетесь сохранить в CSV-файл, в результате чего все данные в такой строке могут отображаться некорректно.

blog-about.ru

CSV File Read using PHP fgetcsv()

This function accepts CSV file handle as mandatory argument. It reads CSV data and converts it into array. The syntax is,

fgetcsv($file_handle,$limit,$separator,$enclosure,$escape_character)

Parameters Description
$file_handle CSV file resource data.
$limit Max length for reading a line of data.
$separator Character delimiter.
$enclosure Character used to enclose values
$escape_character Escape character while reading CSV.

Note:

  • If $file_handle is not a valid resource, then fgetcsv() will return NULL.
  • By specifying a $limit parameter, it will speed up the execution of this function.

CSV File Read Example

First, we have to create a CSV file handle by opening required CSV file. The CSV file we have used for this example is,

fruits.csv

"Apple","RED","#D62433"  "Orange","ORANDE","#FEB635"  "Banana","YELLOW","#FEE492"  "Grapes","VIOLET","#B370AD"  "KIWI","GREEN","#9BA207"  "Dates","BROWN","#922E2F"

In the above CSV file, it has Comma(,) as a separator and Double Quotes(“) as an enclosure.

The CSV file contains fruits table records. Values represent name, color and color code of the fruits. The PHP script to read this file is,

<?php  $CSVfp = fopen("fruits.csv", "r");  if($CSVfp !== FALSE) {   while(! feof($CSVfp)) {   $data = fgetcsv($CSVfp, 1000, ",");   print_r($data);   }  }  fclose($CSVfp);  ?>

In this script, we are invoking fgetCSV() by moving CSV file pointer until it reaches the end of the line. Each time, it converts a current line of data into an array.

PHP CSV String Data Read


The function str_getcsv() is for reading CSV from string data instead of file resource. The syntax is,

str_getcsv($csv_string,$separator,$enclosure,$escape_character)

The first argument is used to pass CSV string data to this function. Rest of the arguments are for the same purpose as we have seen in fgetcsv(). In this function, there is no limit for the reading line of CSV string.

str_getcsv() Example

First, we have to store fruits.CSV file content into a variable and pass it into str_getcsv(). And then, this function is called for separating lines with appropriate line breaks. While iterating among these lines it will be further separated into fields. The script is,

<?php  $str_CSV = '"Apple","RED","#D62433"  "Orange","ORANDE","#FEB635"  "Banana","YELLOW","#FEE492"  "Grapes","VIOLET","#B370AD"  "KIWI","GREEN","#9BA207"  "Dates","BROWN","#922E2F"';    $row = str_getcsv($str_CSV, "n");  $length = count($row);  for($i=0;$i<$length;$i++) {   $data = str_getcsv($row[$i], ",");   print_r($data);  }	  ?>

phppot.com

Импорт и экспорт CSV данных на PHP


Листинг файла index.php

<html>  <head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>Сортировка CSV файлов по заполненности полей</title>  </head>  <body>  <h1>Сортировка CSV файлов</h1>  <!--p>Файлы на выходе программы преобразуются в кодировку UTF-8.</p-->  <?php  /**   * Функция преобразования строки в CSV формате в массив   *   * @param string $filename, int $file_size, string $delimiter   *   * @return string  */  function csv2array($filename='', $file_size, $delimiter=';') {  	ini_set('auto_detect_line_endings', true);  	if(!file_exists($filename) || !is_readable($filename)) {  		return false;  	}  	$header = null;  	$data = array();  	if(($handle = fopen($filename, 'r')) !== false) {  		while(($row = fgetcsv($handle, $file_size, $delimiter)) !== false) {  			if(!$header) {  				if($row[0] != 'sep=') {  					$header = $row;  				}  			} else {  				if (count($header) > count($row)) {  					$difference = count($header) - count($row);  					for ($i = 1; $i <= $difference; $i++) {  						$row[count($row) + 1] = '';  					}  				}  			}  			if($row[0] != 'sep=') .  

(($a[$k] < $b[$k]) ? 1 : -1); } } return 0; }; } else { //если сортировка по одному полю return function($a, $b) use ($keys, $order) { if ($a[$keys] == $b[$keys]) { return 0; } return $order * (($a[$keys] < $b[$keys]) ? 1 : -1); }; } } /** * Функция преобразования массива в строку в CSV формате * * @param @param string $input, int $file_size, string $delimiter, string $enclosure * * @return string */ function str_putcsv($input, $file_size, $delimiter = ';', $enclosure = '"') { // Open a memory "file" for read/write... $fp = fopen('php://temp', 'r+'); // ... write the $input array to the "file" using fputcsv()... fputcsv($fp, $input, $delimiter, $enclosure); // ... rewind the "file" so we can read what we just wrote... rewind($fp); // ... read the entire line into a variable... $data = stream_get_contents($fp); // ... close the "file"... fclose($fp); // ... and return the $data to the caller, with the trailing newline from fgets() removed.

return $data; //rtrim($data, "r"); } // Параметры сортировщика $data_dir_name = "input"; // Каталог с исходными файлами $res_dir_name = "output"; // Каталог с отсортированными файлами $key_list_str = 'email'; // Название столбца для сортировки (с нуля) if(!empty($_REQUEST['action']) && $_REQUEST['action'] = 'run') { if(!isset($_REQUEST['charset'])) { $charset = 'no'; } else { $charset = $_REQUEST['charset']; } $k = 0; $er = 0; $error_file_names = array(); $all_file_count = 0; $entries = scandir($data_dir_name); foreach($entries as $entry) { if(mb_strpos($entry, '.csv') !== false) { // Обрабатываем только CSV файлы $filepath_in = $data_dir_name . "/" . $entry; $file_size = filesize($filepath_in); $csv_data_arr = csv2array($filepath_in, $file_size); $header_arr[0] = array_shift($csv_data_arr); $key_list = array_keys($header_arr[0], $key_list_str); usort($csv_data_arr, sort_arr_ncol($key_list, 'ASC')); $csv_data_arr = array_merge($header_arr, $csv_data_arr); // Формируем строку для CSV файла $res_csv_file = ''; foreach($csv_data_arr as $key_row => $csv_data_arr_row) { $res_csv_file .= str_putcsv($csv_data_arr_row, $file_size); } if($charset == 'yes') { $res_csv_file = iconv("WINDOWS-1251", "UTF-8", $res_csv_file); if($res_csv_file == false) { $res_csv_file = iconv("WINDOWS-1251", "UTF-8//IGNORE", $res_csv_file); $error_file_names[] = $entry; } } $filepath_out = $res_dir_name .

" . $entry; file_put_contents($filepath_out, $res_csv_file) ? $k++ : $er++; $all_file_count++; } } echo "<div id="stat_block">Обработано файлов: <span>" . $k . "</span> из <span>" . $all_file_count . "</span>. Ошибок: <span>" . $er . "</span></div>"; echo "<div id="error_files"><p>" . implode("</p><p>", $error_file_names) . "</p></div>"; } ?> <div><a href="/csv-sorter/">Перезагрузка</a> :: <a href="/csv-sorter/?action=run">Запуск</a>...</div> </body> </html>

Алгоритм работы следующий. Считываются файлы из заданного каталога. Далее данные преобразуются из CSV формата в PHP массив — это по сути импорт CSV.

Функция csv2array($filepath_in, $file_size) считывает CSV данные из файла и преобразует их в массив с помощью стандартной функции PHP fgetcsv().

Далее массив сортируется по заданному полю с помощью функции sort_arr_ncol(). Полезная штука в разных задачах для сортировки многомерных массивов по столбцам.

Далее обработанные данные экспортируются обратно в файл. Вначале преобразуем PHP массив в строку в формате CSV при помощи функции str_putcsv() и записываем результат в файл.

Список компаний до сортировки:

Пример файла в CSV формате

Пример файла после сортировки по столбцу email:


Сортировка по email списка компаний

Теперь мы с вами умеем сохранять результаты парсинга не только в JSON формате, но и в CSV. А уже с CSV могут работать много разных программ и движков сайтов. Например, часто с помощью CSV файлов экспортируются и импортируются товары в интернет-магазинах.

 


seorubl.ru

Как конвертировать в YIA CDataProvider на просмотр? Как загрузить возвращаемый массив из файла PHP? Composer не получает установленные окна 7 Получить имя компьютера клиента Добавление моей настраиваемой библиотеки PHP в include_path используя php для проверки, загружен ли файл javascript? PHP 5.2 Примечание: использование неопределенной константы __DIR__ – предполагается '__DIR__ Как загрузить динамически генерируемый XML-файл PHP в FLASH Почему W3C Validator не принимает теги <? Php include () в HTML5? Как конвертировать VML в png с помощью php Профилирование приложений: использование памяти Проблема PHP SCRIPT с передачей загруженного изображения в функцию facebook-> api Ошибка при создании таблицы MySQL с PDO Переопределение шаблона «Изменить пароль» из пакета FOS User Bundle TYPO3: добавление пользовательских функций набора в контроллер расширения

ruphp.com

Хотя вы можете легко найти учебник по обработке файлов с помощью php, и есть функции (руководство) для обработки CSV, я выложу некоторый код, потому что всего несколько дней назад я работал над проектом, в том числе немного код, который вы могли бы использовать…

HTML:

<table width="600"> <form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data">  <tr> <td width="20%">Select file</td> <td width="80%"><input type="file" name="file" id="file" /></td> </tr>  <tr> <td>Submit</td> <td><input type="submit" name="submit" /></td> </tr>  </form> </table> 

PHP:

if ( isset($_POST["submit"]) ) {   if ( isset($_FILES["file"])) {   //if there was an error uploading the file  if ($_FILES["file"]["error"] > 0) {  echo "Return Code: " . $_FILES["file"]["error"] . "<br />";   }  else {  //Print file details  echo "Upload: " . $_FILES["file"]["name"] . "<br />";  echo "Type: " . $_FILES["file"]["type"] . "<br />";  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";  echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";   //if file already exists  if (file_exists("upload/" . $_FILES["file"]["name"])) {  echo $_FILES["file"]["name"] . " already exists. ";  }  else {  //Store file in directory "upload" with the name of "uploaded_file.txt"  $storagename = "uploaded_file.txt";  move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $storagename);  echo "Stored in: " . "upload/" . $_FILES["file"]["name"] . "<br />";  }  }  } else {  echo "No file selected <br />";  } } 

Я знаю, что должен быть более простой способ сделать это, но я прочитал файл CSV и сохранил отдельные ячейки каждой записи в двухмерном массиве.

if ( $file = fopen( "upload/" . $storagename , r ) ) {   echo "File opened.<br />";   $firstline = fgets ($file, 4096 );  //Gets the number of fields, in CSV-files the names of the fields are mostly given in the first line  $num = strlen($firstline) - strlen(str_replace(";", "", $firstline));   //save the different fields of the firstline in an array called fields  $fields = array();  $fields = explode( ";", $firstline, ($num+1) );   $line = array();  $i = 0;   //CSV: one line is one record and the cells/fields are seperated by ";"  //so $dsatz is an two dimensional array saving the records like this: $dsatz[number of record][number of cell]  while ( $line[$i] = fgets ($file, 4096) ) {   $dsatz[$i] = array();  $dsatz[$i] = explode( ";", $line[$i], ($num+1) );   $i++;  }   echo "<table>";  echo "<tr>";  for ( $k = 0; $k != ($num+1); $k++ ) {  echo "<td>" . fields[$k] . "</td>";  }  echo "</tr>";   foreach ($dsatz as $key => $number) {  //new table row for every record  echo "<tr>";  foreach ($number as $k => $content) {  //new table cell for every field of the record  echo "<td>" . $content . "</td>";  }  }   echo "</table>"; } 

Поэтому я надеюсь, что это поможет, это всего лишь небольшой фрагмент кода, и я его не тестировал, потому что использовал его немного иначе. Комментарии должны объяснять все.

qaru.site

С проблемой обработки больших CSV-файлов на PHP в первый раз я столкнулась недавно. На PHP я вообще мало программирую, только если возникают задачи написать что-либо конкретно на этом языке.

В предыдущей статье были рассмотрены разные варианты импорта CSV-файла в базу данных MySQL. Там же я отметила, что работа с большими файлами требует особого подхода. Основным ограничением для импорта большого объема данных является время выполнения скрипта, которое задается хостером (как правило 30 секунд).

Мне необходимо было именно автоматизировать процесс полного импорта. Перед вставкой в таблицу значения полей, полученные из scv-файла, требовали анализа и дополнительной обработки.

Когда я прочитала в описании утилиты BigDump (в предыдущей статье я на нее ссылалась) о принципе работы:

The script executes only a small part of the huge dump and restarts itself. The next session starts where the last was stopped. (Перевод: Скрипт выполняет лишь небольшую часть SQL-команд из файла и перезапускает сам себя. В следующий раз импорт начинается с того места, в котором скрипт прервал свою работу.)

я поняла, что мне обязательно нужно попробовать такое решение. Поиски в инете чего-то похожего окончились успешно.

$file_name = $_GET['path'];

$conn = mysql_connect ("localhost", "username", "pass")
or die ("Соединение не установлено!");
@mysql_select_db("db_name") or die ("Соединение не установлено!");

if (($handle_f = fopen($file_name, "r")) !== FALSE)
{
// проверяется, надо ли продолжать импорт с определенного места
// если да, то указатель перемещается на это место
if(isset($_GET['ftell'])){
fseek($handle_f,$_GET['ftell']);
}
$i=0;
if(isset($_GET['x'])){
$x=$_GET['x'];
} else {
$x = 0;
}

// построчное считывание и анализ строк из файла
while ( ($data_f = fgetcsv($handle_f, 1000, ";"))!== FALSE) {
$insert_q = 'insert into temp1 (code,contract,price,amount,dat_time,is_op) values '.
' (''.$data_f[0].'',''.$data_f[1].'',''.$data_f[2].'',''.$data_f[3].'',''.$data_f[4].'','0')';
@mysql_query($insert_q);

if(!strstr($i/5000,'.')){
print 'Importing record #: '.$x.'<br />';
flush();
ob_flush();
}

if($i==20000){
print '<meta http-equiv="Refresh" content="0; url='.$_SERVER['PHP_SELF'].'?x='.$x.'&amp;ftell='.ftell($handle_f).'&amp;path='.$_GET['path'].'">';
exit;
}
$x++;
$i++;

}

fclose($handle_f);
} else {$err = 1; echo "Не получилось открыть файл";}

В параметре path при вызове скрипта передается путь к файлу, из которого надо производить импорт. В скрипте происходит импорт определенного количества строк (в примере — 20000), после чего он перезапускает сам себя с параметрами, среди которых кроме названия файла передается указатель на то место, с которого продолжать импорт (ftell).

Я протестировала этот скрипт на файле размером 60 Mb. Отработал он правильно, все проимпортировал. Но время работы, все-таки, хотелось бы уменьшить.

В той же ветке форума, откуда я стырила это решение, обсуждалось, что ускорить работу скрипта при импорте данных в базу можно, заменив одиночные инсерты групповыми.

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

Несправедливо было бы обойти вниманием комментарий maxnag-а к предыдущему посту и не упомянуть о возможности импорта данных из CSV средствами MySQL. Почитала документацию по LOAD DATA INFILE, осталось потестировать на больших файлах 🙂 Сначала я отмела для своего случая такой вариант, но потом решила, что, если он будет достаточно производительным, можно будет проимпортировать данные во временную таблицу, а затем произвести обработку и записать, куда надо. Но о результатах теста как-нибудь в следующий раз.

Всем удачных решений! 🙂

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

parsing-and-i.blogspot.com

Часто возникает задача, переноса Excel таблиц на Web-страницы сайта. На первый взгляд нет ничего проще, — достаточно сохранить файл из Excel в формате html. Но при ближайшем рассмотрении получившигося монстра приходишь в ужас и отказываешься от подобной идеи. Поэтому для переноса Excel-таблиц на сайт, их предварительно сохраняют как CSV-файл, который разбирают и динамически формируют HTML-таблицу. Так как CSV-файлы, всё-таки генерирует Excel, этот формат тоже не проблемный. Ячейки разделяются точкой с запятой и их нужно различать от точек с запятой, которые входят в состав текста ячейки. Сама ячейка, содержащая текстовые данные, обрамлена двойными кавычками, если в ячейке встречается символ двойных кавычек — они удваиваются.

$f = fopen("file.csv", "rt") or die("Ошибка!"); for ($i=0; $data=fgetcsv($f,1000,";"); $i++) {  $num = count($data);  echo "<h3>Строка номер $i (полей: $num):</h3>";  for ($c=0; $c<$num; $c++)  print "[$c]: $data[$c]<br>"; } fclose($f);

Смотри также описание функции fgetcsv().

class File_FGetCSV {     var $VERSION = "1.01";      function fgetcsv($f, $length, $d=",", $q='"') {         $list = [];         $st = fgets($f, $length);         if ($st === false || $st === null) return $st;         if (trim($st) === "") return array("");         while ($st !== "" && $st !== false) {             if ($st[0] !== $q) {                 # Non-quoted.                 list ($field) = explode($d, $st, 2);                 $st = substr($st, strlen($field)+strlen($d));             } else {                 # Quoted field.                 $st = substr($st, 1);                 $field = "";                 while (1) {                     # Find until finishing quote (EXCLUDING) or eol (including)                     preg_match("/^((?:[^$q]+|$q$q)*)/sx", $st, $p);                     $part = $p[1];                     $partlen = strlen($part);                     $st = substr($st, strlen($p[0]));                     $field .= str_replace($q.$q, $q, $part);                     if (strlen($st) && $st[0] === $q) {                         # Found finishing quote.                         list ($dummy) = explode($d, $st, 2);                         $st = substr($st, strlen($dummy)+strlen($d));                         break;                     } else {                         # No finishing quote - newline.                         $st = fgets($f, $length);                     }                 }              }             $list[] = $field;         }         return $list;     }      function fputcsv($f, $list, $d=",", $q='"') {         $line = "";         foreach ($list as $field) {             # remove any windows new lines,             # as they interfere with the parsing at the other end             $field = str_replace("rn", "n", $field);             # if a deliminator char, a double quote char or a newline             # are in the field, add quotes             if(preg_match("/[$d$qnr]/", $field)) {                 $field = $q.str_replace($q, $q.$q, $field).$q;             }             $line .= $field.$d;         }         # strip the last deliminator         $line = substr($line, 0, -1);         # add the newline         $line .= "n";         # we don't care if the file pointer is invalid,         # let fputs take care of it         return fputs($f, $line);     } }

Аналог функции fgetcsv

function fgetcsv($f, $length, $d=",", $q='"') {  $list = [];  $st = fgets($f, $length);  if ($st === false || $st === null) return $st;  if (trim($st) === "") return array("");  while ($st !== "" && $st !== false) {  if ($st[0] !== $q) {  # Non-quoted.  list ($field) = explode($d, $st, 2);  $st = substr($st, strlen($field)+strlen($d));  } else {  # Quoted field.  $st = substr($st, 1);  $field = "";  while (1) {  # Find until finishing quote (EXCLUDING) or eol (including)  preg_match("/^((?:[^$q]+|$q$q)*)/sx", $st, $p);  $part = $p[1];  $partlen = strlen($part);  $st = substr($st, strlen($p[0]));  $field .= str_replace($q.$q, $q, $part);  if (strlen($st) && $st[0] === $q) {  # Found finishing quote.  list ($dummy) = explode($d, $st, 2);  $st = substr($st, strlen($dummy)+strlen($d));  break;  } else {  # No finishing quote - newline.  $st = fgets($f, $length);  }  }   }  $list[] = $field;  }  return $list;  }

htmlweb.ru

Обычно если стоимость создания интернет магазина достаточно высока, заказчики просят сделать импорт товаров из их прайс листов. Им необходимо чтобы была возможность не только добавлять новый товар на сайт, но и обновлять цены и количество на складе уже существующих товаров.

PHP как известно не умеет работать excel-файлами стандартными средствами. Конечно есть множество различных классов, которые могут читать и записывать информацию в excel, но с ними возникает достаточно много проблем (об этом мы напишем в следующих статьях).

Куда проще и удобней работать с csv-файлами.

Для примера сделаем небольшую программку. Она будет обрабатывать csv-файл сотрудников компании OX2.ru.

Создадим новую таблицу в Excel, содержащую следующие поля:

Php csv

Сохраним таблицу как csv-файл, с разделителем поля «;».

У нас должен получиться такой файл:

"Иванов А.А.";"Программист компании OX2.ru";89255552332  "Сидоров А.Е.";"Дизайне компании OX2.ru";89161231212  "Пирожков А.Б.";"Арт-директор OX2.ru";84951232121  "Кулибин Б.А.";"Менеджер OX2.ru";89031233333   

Ниже приведен исходный код с подробным описанием.

Код слелан на ООП с использованием классов, и при небольшой доработки может многократно использоваться в различных приложениях. Если вы не привыкли к программированию на классах, а используете функции или еще что-то, то настоятельно рекомендуем переучиваться ))

Так же в коде используется генерация исключений (Exception), о них читайте в следующих наших статьях.

<?php    /**   * Класс для работы с csv-файлами    * @author дизайн студия ox2.ru     */  class CSV {        private $_csv_file = null;        /**       * @param string $csv_file  - путь до csv-файла       */      public function __construct($csv_file) {          if (file_exists($csv_file)) { //Если файл существует              $this->_csv_file = $csv_file; //Записываем путь к файлу в переменную          }          else { //Если файл не найден то вызываем исключение              throw new Exception("Файл "$csv_file" не найден");           }      }        public function setCSV(Array $csv) {          //Открываем csv для до-записи,           //если указать w, то  ифнормация которая была в csv будет затерта          $handle = fopen($this->_csv_file, "a");             foreach ($csv as $value) { //Проходим массив              //Записываем, 3-ий параметр - разделитель поля              fputcsv($handle, explode(";", $value), ";");           }          fclose($handle); //Закрываем      }        /**       * Метод для чтения из csv-файла. Возвращает массив с данными из csv       * @return array;       */      public function getCSV() {          $handle = fopen($this->_csv_file, "r"); //Открываем csv для чтения            $array_line_full = array(); //Массив будет хранить данные из csv          //Проходим весь csv-файл, и читаем построчно. 3-ий параметр разделитель поля          while (($line = fgetcsv($handle, 0, ";")) !== FALSE) {               $array_line_full[] = $line; //Записываем строчки в массив          }          fclose($handle); //Закрываем файл          return $array_line_full; //Возвращаем прочтенные данные      }    }    try {      $csv = new CSV("ox2.csv"); //Открываем наш csv      /**       * Чтение из CSV  (и вывод на экран в красивом виде)       */      echo "<h2>CSV до записи:</h2>";      $get_csv = $csv->getCSV();      foreach ($get_csv as $value) { //Проходим по строкам          echo "Имя: " . $value[0] . "<br/>";          echo "Должность: " . $value[1] . "<br/>";          echo "Телефон: " . $value[2] . "<br/>";          echo "--------<br/>";      }        /**       * Запись новой информации в CSV       */      $arr = array("Антонов Б.А.;Админ OX2.ru;89031233333",          "Колобков В.Б.;Босс OX2.ru;89162233333");      $csv->setCSV($arr);  }  catch (Exception $e) { //Если csv файл не существует, выводим сообщение      echo "Ошибка: " . $e->getMessage();  }  ?>  

Основную работу с CSV файлами на себя берет класс CSV , Он имеет следующие методы:

setCSV(Array $csv) — записывает данные в csv-файл. Данные должны быть переданы массивом. Метод может дозаписывать csv файл, и создавать новый (читайте в описании).

Метод getCSV читает данные из csv файла, и возвращает двумерный массив следующего вида:

Array  (   [0] => Array   (   [0] => Иванов А.А.   [1] => Программист компании OX2.ru   [2] => 89255552332   )     [1] => Array   (   [0] => Сидоров А.Е.   [1] => Дизайне компании OX2.ru   [2] => 89161231212   )     [2] => Array   (   [0] => Пирожков А.Б.   [1] => Арт-директор OX2.ru   [2] => 84951232121   )     [3] => Array   (   [0] => Кулибин Б.А.   [1] => Менеджер OX2.ru   [2] => 89031233333   )    )   

Пример достаточно простой, несмотря на то что получилось достаточно много кода.

Скачать исходник

И дальше с помощью цикла foreach обходим массив, и выводим в красивом виде содержимое csv файла.

Импорт данных из csv файлов будет полезен не только для обновление товаров в интернет-магазинах, но и для подгрузки/обновлении какой-либо информации на обычный сайт.

Например, мы разрабатывали сайт управляющей компании, и им требовалось ежемесячно публиковать информацию по счетчикам горячей и холодной воды. Все данные у них храняться в excel файлах. И тут прекрасно подошел csv формат!

При этом стоимость создания сайта останется не изменой, а функционал и автоматизация сайта будет на уровень выше чем у конкурентов.

blog.ox2.ru


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.