Инструменты пользователя

Инструменты сайта


csv

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

csv [2018/08/12 06:56] (текущий)
Строка 1: Строка 1:
 +====== XLSX, CSV в MySQL с помощью PHP ======
  
 +{{htmlmetatags>​
 +metatag-description=(Импорт данных из XLSX, CSV при помощи PHP в MySQL)
 +}}
 +
 +
 +**CSV** (Comma-Separated Values — значения,​ разделённые запятыми) — текстовый формат,​ предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы. Значения отдельных колонок разделяются разделительным символом (delimiter). Под CSV, как правило,​ понимают набор значений,​ разделенных какими угодно разделителями,​ в какой угодно кодировке с какими угодно окончаниями строк.
 +
 +CSV и [[PHP]].
 +  * [[http://​php.net/​manual/​ru/​function.fgetcsv.php|fgetcsv]] — Читает строку из файла и производит разбор данных CSV. Эта функция принимает во внимание настройки локали. К примеру,​ если LANG установлена в en_US.UTF-8,​ то файлы в однобайтовой кодировке будут неправильно прочитаны этой функцией.
 +===== Примеры импорта экспорта CSV =====
 +  * [[http://​parsing-and-i.blogspot.com/​2010/​05/​csv-mysql.html|Запись данных из CSV- файлов в базу MySQL]]
 +  * [[Как в PostgreSQL сохранить данные в формате csv]]?
 +  * [[MySQL]]. Источник:​ [[http://​blog.nagaychenko.com/​2010/​02/​13/​%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0-csv-mysql-%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B0%D0%BC%D0%B8/​|Создание csv файла средствами MySql]]<​file sql>
 +SELECT * INTO OUTFILE '/​tmp/​users.csv'​
 +FIELDS TERMINATED BY ';'​ ENCLOSED BY '"'​ ESCAPED BY '​\\'​
 +LINES STARTING BY ''​ TERMINATED BY '​\r\n'​
 +FROM user;
 +</​file>​
 +  * При помощи PHP создание csv файла из данных таблицы MySQL<​file php>
 +$select = "​SELECT * FROM table_name";​
 +
 +$export = mysql_query ( $select ) or die ( "Sql error : " . mysql_error( ) );
 +
 +$fields = mysql_num_fields ( $export );
 +
 +for ( $i = 0; $i < $fields; $i++ )
 +{
 +    $header .= mysql_field_name( $export , $i ) . "​\t";​
 +}
 +
 +while( $row = mysql_fetch_row( $export ) )
 +{
 +    $line = '';​
 +    foreach( $row as $value )
 +    {                                            ​
 +        if ( ( !isset( $value ) ) || ( $value == ""​ ) )
 +        {
 +            $value = "​\t";​
 +        }
 +        else
 +        {
 +            $value = str_replace( '"'​ , '""'​ , $value );
 +            $value = '"'​ . $value . '"'​ . "​\t";​
 +        }
 +        $line .= $value;
 +    }
 +    $data .= trim( $line ) . "​\n";​
 +}
 +$data = str_replace( "​\r"​ , ""​ , $data );
 +
 +if ( $data == ""​ )
 +{
 +    $data = "\n(0) Records Found!\n"; ​                       ​
 +}
 +
 +header("​Content-type:​ application/​octet-stream"​);​
 +header("​Content-Disposition:​ attachment; filename=your_desired_name.xls"​);​
 +header("​Pragma:​ no-cache"​);​
 +header("​Expires:​ 0");
 +print "​$header\n$data";​
 +</​file>​
 +
 +===== Формат файла .xlsx =====
 +Формат файла **.xlsx** основан на Open XML. Для уменьшения размера файла используется сжатие [[ZIP]].
 + 
 +Файлы xlsx совместимы и с более старыми версиями Microsoft Office - 2000, XP, 2003. Но для этого необходимо установить специальный компонент.
 +
 +<note warning>​Поскольку файл XLSX содержит несколько файлов,​ его нельзя импортировать непосредственно в MySQL. Поэтому рекомендуется преобразовать файл XLSX в CSV, а затем импортировать его в базу данных.</​note>​
 +===== Пример импорта xlsx в MySQL =====
 +
 +Используется PHP класс [[https://​github.com/​shuchkin/​simplexlsx|SimpleXLSX class 0.7.13 (Official)]]
 +
 +  - скачиваем класс SimpleXLSX<​file bash>
 +git clone https://​github.com/​shuchkin/​simplexlsx.git
 +</​file>​
 +  - Код преобразующий xlsx в csv<file php>
 +<?php
 +
 +include_once('​simplexlsx.class.php'​);​
 +
 +$file_out='​output_file.csv';​
 +
 +$xlsx = SimpleXLSX::​parse('​input_file.xlsx'​);​
 +$fp=fopen($file_out,'​w'​);​
 +foreach( $xlsx->​rows() as $fields ) {
 +fputcsv($fp,​ $fields);
 +}
 +fclose($fp);​
 +</​file>​
 +  - Преобразуем файл XLSX в [[massivy_php|PHP массив]] и импортировать его в базу данных,​ используя расширения [[PDO]]. Предварительно очищаем таблицу и после загрузки удаляем строку с названиями столбцов.<​file php>
 +
 +try {
 +    $etdb = new PDO('​mysql:​host='​ .
 +            ET_MYSQL_HOST .
 +            ';​dbname='​ . ET_MYSQL_DATABASE,​ ET_MYSQL_USER,​ ET_MYSQL_PASSWORD);​
 +} catch (PDOException $e) {
 +    print "​Error!:​ " . $e->​getMessage() . "<​br />";​
 +}
 +// Clear Table
 +$etdb->​query('​TRUNCATE TABLE df_garne;'​);​
 +
 +$xlsx = SimpleXLSX::​parse('​garne_prices_bags.xlsx'​);​
 +
 +// Insert rows from xlsx
 +$stmt = $etdb->​prepare( "​INSERT INTO df_garne
 +(sku, name, color, price_opt, price_retail,​ size, type, category, brand, url_to_shop,​ consist,
 +description,​ fotos, sex)
 +VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
 +    $stmt->​bindParam( 1, $sku);
 +    $stmt->​bindParam( 2, $name);
 +    $stmt->​bindParam( 3, $color);
 +    $stmt->​bindParam( 4, $price_opt);​
 +    $stmt->​bindParam( 5, $price_retail);​
 +    $stmt->​bindParam( 6, $size);
 +    $stmt->​bindParam( 7, $type);
 +    $stmt->​bindParam( 8, $category);
 +    $stmt->​bindParam( 9, $brand);
 +    $stmt->​bindParam( 10, $url_to_shop);​
 +    $stmt->​bindParam( 11, $consist);
 +    $stmt->​bindParam( 12, $description);​
 +    $stmt->​bindParam( 13, $fotos);
 +    $stmt->​bindParam( 14, $sex);
 +
 +
 +    foreach ($xlsx->​rows() as $fields)
 +    {
 +        $sku = $fields[1];
 +        $name = $fields[2];
 +        $color = $fields[3];
 +        $price_opt = $fields[4];
 +        $price_retail = $fields[5];
 +        $size = $fields[6];
 +        $type = $fields[7];
 +        $category = $fields[8];
 +        $brand = $fields[9];
 +        $url_to_shop = $fields[10];​
 +        $consist = $fields[11];​
 +        $description = $fields[12];​
 +        $fotos = $fields[13];​
 +        $sex = $fields[14];​
 +
 +        $stmt->​execute();​
 +    }
 +
 +// Delete row with names of field
 +$etdb->​query("​DELETE FROM df_garne WHERE sku='​Артикул';"​); ​       ​
 +</​file>​
csv.txt · Последние изменения: 2018/08/12 06:56 (внешнее изменение)