Fputcsv: примеры (PHP)

Примеры и применение функции fputcsv для работы с CSV
Раздел: Работа с файлами
fputcsv(resource $stream, array $fields, string $separator = ",", string $enclosure = '"', string $escape_char = "\\", string $eol = "\n"): int|false
Описание функции fputcsv

Функция fputcsv() форматирует массив данных как строку в формате CSV и записывает её в указанный файловый указатель. Она применяется для экспорта данных в структурированный текстовый формат, удобный для обмена между приложениями.

Функция принимает следующие аргументы:

  • handle (обязательный): Файловый указатель, полученный с помощью fopen(). Указатель должен быть доступен для записи.
  • fields (обязательный): Индексированный массив значений, которые требуется записать.
  • delimiter (необязательный): Односимвольный разделитель полей. По умолчанию запятая (,).
  • enclosure (необязательный): Односимвольный символ ограничителя поля. По умолчанию двойные кавычки (").
  • escape_char (необязательный): Односимвольный символ экранирования. По умолчанию обратный слеш (\). Влияет на обработку символов внутри enclosure.

Возвращаемое значение: целое число с длиной записанной строки в байтах или false при ошибке.

Краткие примеры использования
Запись простого массива
$file = fopen('data.csv', 'w');
$data = ['Иван', 'Петров', 28];
$result = fputcsv($file, $data);
fclose($file);
echo "Записано байт: $result";
Записано байт: 24
Использование пользовательского разделителя и ограничителя
$file = fopen('data.csv', 'w');
$data = ['Яблоко', 'Красное', 'Сладкое'];
$result = fputcsv($file, $data, ';', "'");
fclose($file);
echo "Строка: '" . file_get_contents('data.csv') . "'";
Строка: 'Яблоко;Красное;Сладкое'
Экранирование специальных символов
$file = fopen('data.csv', 'w');
$data = ['Текст с "кавычками"', 'Другой текст'];
$result = fputcsv($file, $data, ',', '"', '/');
fclose($file);
echo "Строка: " . file_get_contents('data.csv');
Строка: "Текст с /"кавычками/"","Другой текст"
Похожие функции в PHP
  • fgetcsv(): Читает строку из файла и парсит её как поля CSV. Используется для импорта данных.
  • str_getcsv(): Анализирует строку CSV и возвращает массив данных. Удобна при работе с уже полученными строками, не требуя файлового указателя.
  • SplFileObject: Класс, предоставляющий методы fputcsv() и fgetcsv() в объектно-ориентированном стиле. Предпочтителен для более сложных операций с файлами.
  • Функции ручного форматирования: Например, объединение массива через implode() с экранированием. Используются при необходимости полного контроля над форматом.
Аналоги в других языках
Python: модуль csv
import csv
with open('data.csv', 'w', newline='') as file:
    writer = csv.writer(file, delimiter=';', quotechar="'")
    writer.writerow(['Иван', 'Петров', 28])
JavaScript (Node.js): ручное формирование или библиотеки
const fs = require('fs');
const data = [['Иван', 'Петров', 28]];
const csv = data.map(row => row.map(cell => `"${cell}"`).join(',')).join('\n');
fs.writeFileSync('data.csv', csv);
MySQL: SELECT ... INTO OUTFILE
SELECT name, surname, age INTO OUTFILE '/tmp/data.csv'
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
FROM users;

Отличия от PHP: Python и JS часто используют библиотеки для автоматического экранирования, а MySQL экспортирует данные напрямую из таблиц.

Типичные ошибки
Передача неверного файлового указателя
$result = fputcsv(false, ['тест']);
var_dump($result);
bool(false)
Попытка записи в файл, открытый только для чтения
$file = fopen('data.csv', 'r');
$result = fputcsv($file, ['тест']);
fclose($file);
var_dump($result);
bool(false)
Проблемы с кодировкой символов
$file = fopen('data.csv', 'w');
$data = ['Текст с кириллицей'];
fputcsv($file, $data);
fclose($file);
// Если файл открывается в редакторе с неправильной кодировкой, символы могут отображаться некорректно.
Изменения в последних версиях PHP
  • До PHP 8.1 параметр escape_char нельзя было задать отдельно от enclosure. Начиная с PHP 8.1, escape_char стал независимым параметром, что позволяет более гибко управлять экранированием.
  • В PHP 8.0 улучшена обработка ошибок типа для аргументов функции.
Расширенные примеры
Запись массива массивов (таблицы данных)
Пример php
$file = fopen('users.csv', 'w');
$rows = [
    ['Имя', 'Фамилия', 'Возраст'],
    ['Анна', 'Иванова', 25],
    ['Петр', 'Сидоров', 32]
];
$bytes = 0;
foreach ($rows as $row) {
    $bytes += fputcsv($file, $row);
}
fclose($file);
echo "Всего записано байт: $bytes";
Использование потока вывода (stdout)
Пример php
$data = ['Данные', 'для', 'терминала'];
$result = fputcsv(STDOUT, $data);
"Данные","для","терминала"
Работа с нестандартным символом экранирования
Пример php
$file = fopen('data.csv', 'w');
$data = ['Текст "в кавычках"', 'Еще "текст"'];
// Используем символ | для экранирования кавычек внутри поля
fputcsv($file, $data, ',', '"', '|');
fclose($file);
echo file_get_contents('data.csv');
"Текст |"в кавычках|"","Еще |"текст|""
Обработка числовых форматов и локалей
Пример php
setlocale(LC_ALL, 'ru_RU.UTF-8');
$file = fopen('data.csv', 'w');
$data = [1234.56, 'текст'];
fputcsv($file, $data);
fclose($file);
// Разделитель дробной части зависит от локали, но в CSV обычно используется точка.

PHP fputcsv function comments

En
Fputcsv Format line as CSV and write to file pointer