Задать вопрос
@filippovanatoliy
Вот начал погружаться в кодинг)

Как сделать Импорт данных из csv в несколько xml?

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

Есть выгрузка в csv файл за 1 месяц (показания электросчетчика за каждые 30 минут), есть требования Мосэнергосбыта принимать показания в файлах xml по заданному образцу, за каждый день.

Вопрос такой. Вот если бы у меня на входе было бы образно 30 файлов csv и мне надо было просто бы подставлять значения в xml, я бы ещё понял. Но как из одной длинной входной таблицы получить на выходе 30 маленьких xml не понятно.

Подскажите пожалуйста, в каком направлении думать? Может, мне проще сделать это вообще на php на сервере, чтобы не было привязки к excel
  • Вопрос задан
  • 42 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
iResource
@iResource
Разработчик IR XML2Ozon
Может, мне проще сделать это вообще на php на сервере, чтобы не было привязки к excel

Так я и сделал бы.
Через функцию, код которой приведу ниже, - прочитать CSV в массив, и потом в переборе массива генерировать нужные XML через, к примеру, SimpleXML.
Пример функции чтения CSV - можно читать только нужные столбцы, экономить память:

// чтение CSV в удобный массив
if (!function_exists('csv2array')) {
    // $only_fields - массив с названиями нужных столбцов
    function csv2array($file, $charset_in = 'windows-1251', $charset_out = 'utf-8', $only_fields = [])
    {
        $handle = fopen($file, 'r');
        if ($handle === false) {
            echo 'Не удалось открыть файл '.$file;
            return false;
        }
        $data = $fields = [];
        $i = 0;
        if ($handle) {
            while (($row = fgetcsv($handle, 0, ';')) !== false) {
                if (empty($fields)) {
                    foreach ($row as $k => $r) {
                        $row[$k] = iconv($charset_in, $charset_out.'//IGNORE', $r);
                    }
                    $fields = $row;
                    continue;
                }
                foreach ($row as $k => $value) {
                    if (!empty($fields[$k])) {
                        if (!empty($only_fields) && is_array($only_fields) && !in_array($fields[$k], $only_fields)) {
                            continue;
                        }
                        $value = iconv($charset_in, $charset_out.'//IGNORE', $value);
                        $data[$i][$fields[$k]] = $value;
                    }
                }
                $i++;
            }
            if (!feof($handle)) {
                echo 'Error: unexpected fgets() fail'.PHP_EOL;
            }
            fclose($handle);
        }
        return $data;
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы