Php для создания нескольких файлов CSV (ы) из одного запроса MySQL

ОБНОВЛЕНИЕ № 1
У меня есть один PHP-файл с несколькими запросами, которые создают несколько CSV-файлов.
Я хочу объединить запросы.

Мой mysql table имеет 5 столбцов: идентификатор, валюта, курс, дата, время

Создать таблицу table и вставить несколько записей

    CREATE TABLE IF NOT EXISTS `table` ( `id` INT NOT NULL AUTO_INCREMENT , `currency` VARCHAR(254) NOT NULL , `rate` FLOAT NOT NULL , `date` VARCHAR(254) NOT NULL , `temptime` DATE NOT NULL , PRIMARY KEY (`id`), UNIQUE `UNIQUE` (`currency`, `temptime`)) ENGINE = MyISAM;

INSERT INTO `table`
(currency, rate, date, temptime)
VALUES
('USD', '1.232', '1521212400', '2018-03-16'),
('USD', '1.258', '1521126000', '2018-03-15'),
('JPY', '133.82', '1521212400', '2018-03-16'),
('JPY', '131.88', '1521126000', '2018-03-15'),
('EUR', '1.99', '1521212400', '2018-03-16'),
('EUR', '1.85', '1521126000', '2018-03-15'),
('BRL', '1.6654', '1521212400', '2018-03-16'),
('BRL', '1.5498', '1521126000', '2018-03-15'),
('ZAR', '1.99654', '1521212400', '2018-03-16'),
('ZAR', '2.0198', '1521126000', '2018-03-15'),
('RUB', '19.9654', '1521212400', '2018-03-16'),
('RUB', '20.0198', '1521126000', '2018-03-15');

Вот два запроса, которые я хочу объединить для столбца «валюта» USD и EUR:

    $result = mysql_query("SELECT temptime, rate FROM `table` WHERE currency='USD' ORDER BY date asc");
if (!$result) die('Couldn\'t fetch records');
$num_fields = mysql_num_fields($result);
$headers = array();
for ($i = 0; $i < $num_fields; $i++)
{
$headers[] = mysql_field_name($result , $i);
}
$fp = fopen('csv/USD.csv', 'w');


if ($fp && $result)
{
fputcsv($fp, $headers);
while ($row = mysql_fetch_row($result))
{
fputcsv($fp, array_values($row));
}
}

$result = mysql_query("SELECT temptime, rate FROM `table` WHERE currency='EUR' ORDER BY date asc");
if (!$result) die('Couldn\'t fetch records');
$num_fields = mysql_num_fields($result);
$headers = array();
for ($i = 0; $i < $num_fields; $i++)
{
$headers[] = mysql_field_name($result , $i);
}
$fp = fopen('csv/EUR.csv', 'w');


if ($fp && $result)
{
fputcsv($fp, $headers);
while ($row = mysql_fetch_row($result))
{
fputcsv($fp, array_values($row));
}
}

Спасибо

0

Решение

Вы можете использовать поле валюты в каждой строке, чтобы решить, в какой файл записывать, я использовал массив дескрипторов файлов, поэтому вместо каких-либо условий для какого-либо файла вы просто используете валюту в качестве индекса для дескриптора файла. ,

// Create an array of files, each associated with currency
$fp = array( 'EUR' => fopen('csv/EUR.csv', 'w'),
'USD' => fopen('csv/USD.csv', 'w'));

$result = mysql_query("SELECT currency, temptime, rate FROM `table` ORDER BY date asc");
if (!$result) die("Couldn't fetch records");
$num_fields = mysql_num_fields($result);
$headers = array();
for ($i = 0; $i < $num_fields; $i++)
{
$headers[] = mysql_field_name($result , $i);
}
// Write out headers to each file.
foreach ( $fp as $output )  {
fputcsv($output, $headers);
}

while ($row = mysql_fetch_row($result))     {
// Use first field to decide which file to write to.
$currency = array_shift($row);
fputcsv($fp[$currency], $row);
}
// Close all of the files.
foreach ( $fp as $output )  {
fclose($output);
}

Поскольку у меня нет вашей базы данных, я не могу это проверить, но если у вас возникнут проблемы, дайте мне знать.

1

Другие решения

Также рассмотрите возможность использования без циклов и экспорта в CSV напрямую из MySQL с его SELECT ... INTO OUTFILE (дополнение LOAD DATA INFILE).

В частности, выполните оба запроса действий отдельно в PHP (обязательно избегайте кавычек). Хотя этот процесс не объединен, он должен быть более быстрым процессом ввода-вывода для чтения / записи, чем несколько циклов. Кроме того, вы можете поменять слой приложения (т. Е. Использовать Python, Java) без изменения кода экспорта в CSV!

SELECT temptime, rate
INTO OUTFILE '/path/to/csv/USD.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM `table`
WHERE currency='USD'
ORDER BY `date` asc;

SELECT temptime, rate
INTO OUTFILE '/path/to/csv/EUR.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM `table`
WHERE currency='EUR'
ORDER BY `date` asc;

И для одного вызова, помещенного как в хранимую процедуру MySQL:

DELIMITER $$
DROP PROCEDURE IF EXISTS export_csv$$

CREATE PROCEDURE export_csv
BEGIN
-- SELECT ... INTO OUTFILE COMMANDS
END$$

DELIMITER ;

Затем в PHP запустите его с помощью одной строки (используя mysqli API):

$result = mysqli_query($conn, "CALL export_csv")

Обратите внимание: заголовки не передаются с указанными выше командами. Чтобы разрешить настройку запроса с помощью объединения, требующего преобразования типов. И CSV не хранят метаданные типов или юникодов, чтобы иметь проблему здесь.

SELECT 'temptime' as col1, 'rate' as col2
UNION ALL
SELECT CAST(temptime, CHAR(10) as col1,
CAST(ROUND(rate,4) AS CHAR(3)) as col2
INTO OUTFILE '/path/to/csv/USD.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM `table`
WHERE currency='USD' ;
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector