Функция Fgetcsv
читает строку из файла и производит разбор данных CSV
.
array fgetcsv(resource $handle [, int $length = 0 [, string $delimiter = "," [, string $enclosure = """ [, string $escape = "\" ]]]])
Функция Fgetcsv
похожа на функцию Fgets , с той разницей, что она производит анализ строки на наличие записей в формате CSV
и возвращает найденные поля в качестве массива.
Параметр Handle являет собой корректный файловый указатель на файл, успешно открытый при помощи Fopen , Popen или Fsockopen .
Параметр Length должен быть больше самой длинной строки (в символах), найденной в CSV-файле (включая завершающий символ конца строки). В противном случае, строка будет разбита на куски длиной в Length символов если только место разрыва не будет внутри ограничителей полей (Enclosure ).
Необязательный параметр Delimiter устанавливает разделитель поля (только один символ).
Необязательный параметр Enclosure устанавливает символ ограничителя поля (только один символ).
Необязательный параметр Escape устанавливает экранирующий символ (только один символ).
Функция Fgetcsv возвращает индексированный массив с прочтенными полями или NULL , если передается неверный параметр Handle , или FALSE при других ошибках, в том числе и по достижении конца файла.
Пустая строка CSV-файла будет возвращена в качестве массива, содержащего единственный элемент NULL , ошибки в данном случае не возникнет.
Очень много фирм, организаций, и т.д. в своей работе используют расширение Microsoft Office - EXEL. В одних, в Exel сохраняются продукция, в других информация о товарах, пользователях, цены, или даже просто номера телефонов. Бывает необходимость эти данные перенести в другую базу данных, например для WEB .
Для начала, нужно открыть Ваш файл Exel с расширением .XLS . Потом сохранить его как .CSV . Теперь его можно использовать и в веб приложениях. Этот же файл можно открыть любим редактором, например Total comander , и вы увидите его содержимое. Если же открыть также XLS файл, то будут видны только множество неразборчивого и непонятного кода.
Также можно преобразовывать в CSV файли и таблицы из Microsoft Office и OpenOffice Writer .
Для OpenOffice Writer делается это следующим образом:
1. Создаем таблицу.
2. Выбираем в меню "Таблица" -> "Преобразовать" -> "Таблицу в текст".
3. Указываем разделитель текста, например "@" и подтверждаем действие нажатием на кнопку Ok.
5. Последнее что нужно сделать, это переименовать test.txt в test.csv .
Вот теперь мы создали файл, который доступен для импорта в скрипт PHP:
// открываем файл для чтения
$fh = fopen("test.csv", "r");
// читаем строку из файла и производим разбор данных CSV
$info = fgetcsv($fh, 1000, "@");
// выводим масив результат
print_r($info);
// закрываем файл
fclose($fh);
Результатом выполнения будет первая строка таблицы.
Для того, чтоб прочитать весь файл CSV
, можно использовать цикл While :
// открываем файл для чтения
$fh = fopen("test.csv", "r");
// выводим масив результат
print_r($info);
}
// закрываем файл
fclose($fh);
Для того, чтоб обратиться к каждому отдельному элементу, можно воспользоваться языковой конструкцией List :
// открываем файл для чтения
$fh = fopen("test.csv", "r");
while (($info = fgetcsv($fh, 1000, "@")) !== false) {
// сохнаряем значения массива в переменные
list($var1, $var2) = $info;
}
// закрываем файл
fclose($fh);
Благодаря функции Fgetcsv
можно обработать большое количество данных из таблиц.
Разберём ещё несколько практических задач из области разработки PHP парсеров, связанных с импортом, сортировкой и экспортом CSV данных. Часто требуется представить результаты парсинга в виде CSV файла, далее такой файл можно импортировать в базу данных сайта. Средства импорта CSV данных часто поддерживаются стандартными средствами различных CMS.
CSV (Comma-Separated Values ) — текстовый формат, предназначенный для представления табличных данных. Из названия следует, что данные разделены запятыми, но могут использоваться и другие разделители, например, точка с запятой (DSV формат).
CSV файлы можно открывать разными текстовыми редакторами, а также программой EXCEL. Но бывают проблемы с кодировкой. Например, EXCEL плохо переваривает UTF-8 без BOM. Под EXCEL нужно данные просто в UTF-8 сохранять.
В тестовой задаче нам нужно отсортировать ряд CSV файлов по столбцу email. Файлы содержат списки организаций с различными контактными данными, при этом не у всех фирм есть электронная почта. Так, чтобы облегчить работу со списками удобно скриптом отсортировать списки и наверх поставить компании с известными почтовыми ящиками.
Скрипт index.php и каталог с входными данными следует разместитьть в папке csv-sorter .
Обработанные файлы будут записываться в директорию output .
Импорт и экспорт CSV данных на PHP
Листинг файла index.php
Сортировка CSV файлов
count($row)) { $difference = count($header) - count($row); for ($i = 1; $i <= $difference; $i++) { $row = ""; } } } if($row != "sep=") { $data = $row; } } fclose($handle); } return $data; } /** * Функция сортировки массива по 1-му полю или N полей * * @param string|array $keys, string $order * * @return int */ function sort_arr_ncol($keys, $order = "ASC") { $order = ($order == "DESC") ? -1: 1; if(is_array($keys)) { //если сортировка по нескольким полям return function($a, $b) use ($keys, $order) { foreach($keys as $k) { if($a[$k] != $b[$k]) { return $order * (($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 = array_shift($csv_data_arr); $key_list = array_keys($header_arr, $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 "" . implode("
", $error_file_names) . "