Чтение CSV-файла PHP
Обновлено: 21.11.2024
В этом посте я покажу вам, как использовать встроенные функции PHP для чтения и печати содержимого CSV-файла и преобразования его в массив. Мы будем использовать fopen() и fgetcsv() для чтения содержимого CSV-файла, а затем преобразуем его в массив с помощью функций array_map() и str_getcsv().
Введение
Хранение файлов данных в формате значений, разделенных запятыми (CSV), не является чем-то новым. На самом деле, это один из самых распространенных способов хранения данных из-за его простоты — файлы CSV легко читать и писать, и их можно открыть в обычном текстовом редакторе. Этот тип файла хранит табличные данные в виде обычного текста.
Пример такого файла будет выглядеть следующим образом:
Эти данные представляют информацию о трех людях со столбцами, соответствующими их именам, возрасту и работе. Хотя это простой формат данных, его сложно читать и использовать.
Поэтому в этой статье я научу вас, как открывать CSV-файлы с помощью собственных функций PHP, таких как fopen() , как читать содержимое этого файла с помощью метода fgetcsv() и, наконец, как конвертировать этот CSV-файл в массив с помощью функции array_map().
Конечно, для этого можно использовать ряд сторонних пакетов, но в PHP есть встроенные функции, которые прекрасно работают.
Предпосылки
Чтобы продолжить работу с этой статьей, вам потребуется следующее:
- На вашем компьютере установлен PHP версии 5.6 или выше
- среда разработки для PHP — хорошо работает XAMPP или WampServer
- некоторое базовое понимание концепций PHP
Отображение CSV-файла в виде таблицы
В этом разделе статьи мы будем читать простой CSV-файл, содержащий несколько слов, разделенных запятой. Для начала мы будем использовать простой файл, который мы использовали выше, а затем мы можем перейти к использованию случайного большего файла. Конечно, вы можете создать свой собственный файл с помощью Microsoft Excel или текстового редактора и сохранить его с расширением CSV.
Чтобы прочитать файл, мы сначала должны найти его в папке или месте, где он сохранен. Для облегчения доступа вы можете сохранить его в той же папке, где находится файл программы. Затем мы можем использовать функцию fopen() для чтения файла.
После этого функция fgetcsv() проверяет поля CSV из проанализированной строки открытого файла. Для этой функции требуются три параметра: дескриптор файла, возвращаемый функцией fopen(), максимальная длина считываемой строки и специальный символ-разделитель, который мы называем «разделителем». Это может быть запятая, точка с запятой или любой другой разделитель.
Теперь приступим к практике.
Создайте файл с именем csvtable.php где-нибудь, где он может работать с WAMP или XAMPP, и скопируйте следующий код.
В этом файле мы сначала открываем файл data.csv, который должен содержать некоторые данные, разделенные запятыми. fopen будет искать этот файл в той же папке, что и csvtable.php. Параметр 'r' указывает fopen открывать файл только для чтения.
Если файл успешно открыт, fopen вернет дескриптор файла, который можно использовать для других операций чтения файла. В противном случае он вернет FALSE. Поэтому мы проверяем, что дескриптор файла не равен FALSE, прежде чем продолжить чтение файла.
Затем файл fgetcsv() извлекает поля CSV из открытого файла по одной строке за раз. Мы указываем fgetcsv читать не более 100 символов в строке и использовать запятую в качестве разделителя. Затем слова, найденные в файле, перебираются и печатаются в таблице HTML.
Последняя функция — это функция fclose(), которая закрывает открытый файл. Это освобождает память, используемую открытым файлом, и позволяет другим процессам иметь доступ к файлу.
Откройте csvtable.php через локальный сервер WAMP или XAMPP или запустите php read.php из командной строки, чтобы увидеть следующий вывод:
Первая часть того, что нам нужно было сделать, уже сделано!
Теперь мы перейдем к преобразованию необработанных полей CSV в массив.
Преобразование необработанного CSV-файла в массив
Теперь существует несколько способов создания массива. Мы можем использовать функцию fgetcsv() для автоматического преобразования содержимого CSV-файла в массив или использовать array_map .
Использование fgetcsv() для преобразования CSV-файла в массив
Это похоже на пример выше, где мы использовали fgetcsv() для отображения CSV-файла в виде HTML-таблицы. Давайте посмотрим на это в действии. Создайте файл PHP со следующим содержимым:
В приведенном выше коде мы создали функцию для чтения CSV-файла и преобразования его в массив. Мы передаем параметр с именем файла документа CSV и путем.
Затем мы используем функцию feof(), чтобы проверить, достигнут ли конец файла. Пока это не так, нам нужно проанализировать поля CSV с помощью функции fgetcsv(), как мы это делали в примере выше.
Проанализированные поля CSV из файла CSV преобразуются в массив с помощью функции fgetcsv() и добавляются по одному в переменную $lines[].
Наконец, не забудьте использовать функцию fclose(), чтобы закрыть открытый файл перед выходом из функции.
Затем мы вызываем функцию readDocument, которая передает CSV-документ в качестве параметра, после чего содержимое CSV-файла отображается, как показано ниже:
Использование array_map() для чтения CSV-файла
Кроме того, вы можете использовать функцию array_map() для чтения CSV-файла в массив. Для этого вы будете использовать str_getcsv в качестве функции обратного вызова. Это встроенная функция PHP, которая используется для преобразования строки CSV в массив.
Функция обратного вызова – это исполняемый код, который передается другому фрагменту кода в качестве аргумента. Ожидается, что позже этот аргумент будет вызван кодом, которому он передан.
Вот как мы можем использовать array_map и str_getcsv для отображения наших данных CSV в массив:
Приведенный выше код использует метод file() для чтения CSV-файла в массив строк. Затем с картой массива он вызывает str_getcsv() для каждой строки и сохраняет данные для всего файла в $csv. Функция str_getcsv() анализирует содержимое поля CSV каждой строки в массив.
Вывод приведенного выше фрагмента кода будет таким же, как и выше.
Обратите внимание, насколько меньше кода требуется при непосредственном использовании функций file() и array_map()?
Заключение
В этой статье вы узнали, как обрабатывать CSV-файл в PHP, читая и отображая его содержимое с помощью встроенных функций PHP, таких как fopen() и fgetcsv(), и преобразовывая поля CSV в массив. Я показал вам два способа сделать это.
Предположим, у меня есть файл .csv со следующим содержимым:
Как я могу анализировать содержимое с помощью PHP?
По сути, вы спрашиваете, есть ли лучший способ ООП для работы с разбором CSV, чем стандартный подход к глобальной функции. Я бы посоветовал переформулировать вопрос, так как на самом деле это не похоже на проблему синтаксического анализа CSV.
Все в порядке, я просто говорю. Если вам нужен класс, то этот подойдет (хотя я немного подправил его в своей работе..)
6 ответов 6
Просто используйте функцию для анализа CSV-файла
Чуть более короткий ответ, так как PHP >= 5.3.0:
Обратите внимание, что это не работает, если у вас есть символы новой строки в фактических значениях (а не разделители строк в конце каждой строки csv), потому что файловая функция разбивается на новые строки и не знает о кавычках, которые CSV используется для хранения значений полей.
@Julix использует принятый ответ. Эта более короткая версия удобна, если вы знаете, что импортированные данные никогда не будут иметь разрывов строк внутри одного значения, но в остальном более надежное решение стоит дополнительных строк кода.
Удобный лайнер для преобразования CSV-файла в массив
Обратите внимание, что это не работает, если у вас есть символы новой строки в фактических значениях (а не разделители строк в конце каждой строки csv), потому что файловая функция разбивается на новые строки и не знает о кавычках, которые CSV используется для хранения значений полей.
Используйте следующее, чтобы исправить проблему с новой строкой: array_map('str_getcsv', file('data.csv' , FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
Только что обнаружил удобный способ получить индекс при синтаксическом анализе. Мой разум был взорван.
На нашем сервере установлен PHP 5.2.9, и из-за этого я не могу получить доступ к str_getcsv. С другой стороны, fgetcsv восходит к PHP 4, так что это было полезно. Спасибо.
@valerie Мне почти всегда нужен индекс при разборе CSV. Цикл for предоставляет индекс без отдельного объявления и инкрементатора.
в моем случае я собираюсь получить CSV-файл через веб-службы, поэтому мне не нужно создавать файл. Но если вам нужно парсить с файлом, нужно передать только как строку
У меня это не сработало. Например, это: aaa,bbb,"ccc\nddd",eee было разобрано на две строки (вместо желаемой одной строки) вместо одной. Кажется, что " не распознается как вложение, когда оно появляется внутри поля (а не в его начале или конце). Таким образом, $data = str_getcsv(..) можно заменить на $data = взорвать(..) , что я' угадывание более эффективно и лучше передает намерение.
Не тот ответ, который вы ищете? Просмотрите другие вопросы с тегами php csv fgetcsv или задайте свой вопрос.
Связано
Связанные
Горячие вопросы о сети
дизайн сайта / логотип © 2022 Stack Exchange Inc; вклады пользователей под лицензией cc by-sa. версия 2022.3.21.41727
Вывод: в этом руководстве вы узнаете, как работать с CSV-файлами в PHP, включая создание и чтение CSV-файлов.
Краткое знакомство с CSV-файлами
CSV означает значения, разделенные запятыми. CSV-файл — это текстовый файл, в котором хранятся табличные данные в виде значений, разделенных запятыми. Файл CSV хранит каждую запись в строке. И у него может быть заголовок.
Когда вы откроете CSV-файл с помощью приложения для работы с электронными таблицами, вы увидите, что файл красиво отформатирован следующим образом:
Однако если просмотреть CSV-файл в текстовом редакторе, он будет выглядеть следующим образом:
Обычно в CSV-файле используется запятая ( , ) для разделения полей в CSV-файле. Если содержимое поля также содержит запятую ( , ), файл CSV заключает это поле в двойные кавычки, например, «Facebook, Inc.»
Помимо символа запятой ( , ) файл CSV может использовать другие символы для разделения полей, например точку с запятой ( ; ).
Запись в файл CSV
Чтобы записать строку в CSV-файл, используйте функцию fputcsv():
В следующем примере используется функция fputcsv() для записи данных в файл CSV:
- Сначала определите массив, содержащий биржевые данные.
- Во-вторых, откройте файл stock.csv для записи с помощью функции fopen() в режиме 'w'.
- В-третьих, выполните цикл по массиву $data и запишите каждый элемент в виде строки в CSV-файл.
- Наконец, закройте файл с помощью функции fclose().
Написание символов Юникода
Если вы имеете дело с символами Unicode, особенно при создании файла CSV для использования Microsoft Excel, вам необходимо изменить заголовок файла с помощью функции fputs() после открытия файла следующим образом:
Чтение из файла CSV
Чтобы прочитать CSV-файл, используйте функцию fgetcsv():
Функция fgetcsv() считывает строку данных CSV из позиции указателя файла и помещает ее в массив; каждая строка файла CSV является элементом массива.
Функция fgetcsv() возвращает false, если произошла ошибка при чтении файла или когда указатель файла достигает конца файла.
В этом руководстве мы покажем вам, как читать CSV-файл с помощью PHP. Для этого мы будем использовать нативную функцию PHP fgetcsv.
Взгляните на следующий CSV-файл, который я назвал example.csv.
Теперь давайте прочитаем этот CSV-файл с помощью PHP.
Приведенный выше код довольно прост.
- Мы открываем CSV-файл с помощью функции fopen.
- После этого мы просматриваем каждую строку CSV-файла с помощью функции fgetcsv.
- Функция fgetcsv возвращает массив, содержащий значения всех столбцов. Если вы сделаете var_dump переменной $row внутри цикла while, вы получите более четкое представление о ее структуре.
- Наконец, fgetcsv вернет значение FALSE, как только будет достигнут конец файла. Это разорвет наш цикл while.
Если вы запустите приведенный выше код, вы увидите, что переменная $row представляет собой массив, содержащий данные столбцов из каждой строки.
Первый столбец — это имя человека, второй столбец — его страна проживания, а последний столбец — его возраст. В файле эти столбцы разделены запятыми. Однако функция PHP fgetcsv будет автоматически анализировать каждую строку за вас.
Другими словами, нет необходимости вручную разбивать линию с помощью функции разнесения. PHP сделает все это за вас.
Доступ к определенным столбцам в CSV-файле.
Если вы посмотрите на пример данных, то увидите, что в каждой строке есть три столбца. Это означает, что функция fgetcsv «разберет» эти три столбца в массив $row.
Например, если мы хотим получить доступ к стране происхождения человека, мы можем получить к ней такой доступ.
Примечание. Мы используем 1, потому что массивы PHP начинаются с 0.
В следующем примере мы распечатаем каждый столбец и строку в файле CSV.
Как видите, каждое значение в строке доступно через определенный индекс массива. Другими словами:
Если вы все еще немного запутались во всем этом, обязательно сохраните пример данных выше в файл CSV, чтобы вы могли поиграть с ним!
Пропуск пустых строк.
Если вы встретите массив с одним значением null, это означает, что в вашем CSV-файле есть пустая строка. Чтобы пропустить пустые строки с помощью PHP, вы можете сделать что-то вроде этого.
Читайте также: