Php: работа с CSV-файлами

16.08.2011

Описываются основы работы с CSV-файлами в PHP

Работая над одним проектом, который вскоре появится в портфолио, мне была предоставлена база данных в MS Excel, в которой находилось около 17 тыс. записей.

Необходимо было написать парсер, чтобы перегнать её в mysql. На самом деле есть несколько вариантов решения данной проблемы:

сохранить базу как csv файл, и написать парсер к файлу;
сохранить базу как xml файл; для подключения к серверу я использую SQLyog, в нем есть возможность прочитать и записать в базу xml-файл;
использоваться стандартными средствами mysql(кстати интересный вариант, ссылка на описание внизу).
Я выбрал первый вариант, т.к. база достаточно кривая и была необходимость изменить некоторые ячейки таблицы.

Вот скрин полей базы:

Для работы с csv-файлами в php есть 2 функции:

fgetcsv();
fputcsv().
Первая получает строку файла, вторая записывает в файл. Нам понадобится первая.

В качестве параметров эта функция принимает: указатель на открытый файл, максимальное количество считываемых символов в строке и разделитель между столбцами(при импорте из Excel в качестве разделителя используется ‘;’).

У меня в скрипте получилось так: $data = fgetcsv($f, 1000, ‘;’);

Таким образом, эта функция возвращает массив, элементами которого являются ячейки одной строки. В моем случае $data[0] – содержал уникальный номер записи, а $data[1] – Рубрику и т.д.

Обходим таким образом весь файл и при каждой итерации записываем данные в базу mysql. Ниже приведен полный код скрипта:

 

// Открываем файл
 
$f = fopen('telephone.csv', 'r');
 
// самая первая строка - заголовки столбцов - мне не нужна
 
$data = fgetcsv($f, 1000, ';');
 
$db = mysql_connect($host, $user, $pass)
 
  or die("Невозможно подключиться к серверу");
 
mysql_select_db($bd_name, $db)
 
  or die("Ошибка выбора БД");
 
// Пока файл не закончен
 
while(!feof($f)) {
 
  $data = fgetcsv($f, 1000, ';');
 
  // Уникальный идентификатор записи
 
  $data[0] = (int) $data[0];
 
  $data[0] = addslashes(trim($data[0]));
 
  // Рубрика
 
  $data[1] = addslashes(trim($data[1]));
 
  // Телефон
 
  $data[2] = addslashes(trim($data[2]));
 
  // E-mail
 
  $data[3] = addslashes(trim($data[3]));
 
  // Название
 
  $data[4] = addslashes(trim($data[4]));
 
  // Адрес
 
  $data[5] = addslashes(trim($data[5]));
 
  // Описание деятельности
 
  $data[6] = addslashes(trim($data[6]));
 
  // Пишим в БД
 
  $query = "INSERT INTO phones(id,category,phone,
 
    email,title,address,description)
 
    VALUES('".$data[0]."','".$data[1]."','".$data[2]."','"
 
    .$data[3]."','".$data[4]."','".$data[5]."','".$data[6]."')";
 
  mysql_query($query, $db) or die ("Ошибка записи в БД");
 
}
 
mysql_close();

 

blog comments powered by Disqus
Наверх