Использование PHP, чтобы взять первую строку файла CSV и создать таблицу MySQL с данными

Я пытаюсь взять довольно большой файл CSV и вставить его в базу данных MySQL для ссылки в проекте. Я хотел бы использовать первую строку файла для создания таблицы с использованием правильных типов данных, а не varchar для каждого столбца. Конечная цель - автоматизировать этот процесс, поскольку у меня есть несколько похожих файлов, но в каждом из них разные данные и разное количество «столбцов» в файлах CSV. Проблема, с которой я столкнулся, заключается в том, что gettype () возвращает «строку» для каждого столбца вместо int, float и string, как я бы хотел.

Платформа - PHP 5, ОС - ubuntu 8.04.

вот мой код:

<?php

// GENERATE TABLE FROM FIRST LINE OF CSV FILE

$inputFile = 'file.csv';
$tableName = 'file_csv';

$fh = fopen($inputFile, 'r');
    $contents = fread($fh, 5120); // 5KB
fclose($fh);

$fileLines = explode("\n", $contents); // explode to make sure we are only using the first line.

$fieldList = explode(',', $fileLines[0]); // separate columns, put into array
echo 'CREATE TABLE IF NOT EXISTS `'.$tableName.'` ('."<br/>\n";
for($i = 0; $i <= count($fieldList); $i++)
{
    switch(gettype($fieldList[$i])) {
        case 'integer':
            $typeInfo = 'int(11)';
            break;
        case 'float':
            $typeInfo = 'float';
            break;
        case 'string':
            $typeInfo = 'varchar(80)';
            break;
        default:
            $typeInfo = 'varchar(80)';
            break;
    }
if (gettype($fieldList[$i]) != NULL) echo "\t".'`'.$i.'` '.$typeInfo.' NOT NULL, --'.gettype($fieldList[$i]).' '.$fieldList[$i]."<br/>\n";
}
echo '  PRIMARY KEY  (`0`)'."<br/>\n";
echo ') ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;';

Пример Первая строка: 1,0,0,0,0,0,0,0,0,0,0,0,0.000000,0.000000,0,0,0`` 0,0,1,0,50, 'Слово отзыва ( СТАРЫЙ)',

Не могли бы вы добавить информацию о своей платформе?

Ilya Kochetov 06.10.2008 11:52

платформа: php5 на ubuntu 8.04

Jayrox 06.10.2008 11:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
7 478
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Попробуйте преобразовать значение и сравнить его с исходным:

define('DECIMAL_SEPARATOR', '.');

switch ($fieldList[$i])
{
    case (string)(int)$fieldList[$i]:
        $typeInfo = (strpos($fieldList[$i], DECIMAL_SEPARATOR) === false) ? 'int(11)' : 'float';
        break;
    case (string)(float)$fieldList[$i]:
        $typeInfo = 'float';
        break;
    default:
        $typeInfo = 'varchar(80)';
        break;
}

Дополнительно проверьте наличие десятичного разделителя в первом случае для чисел, которые являются круглыми, но имеют часть десятичной дроби.

Просто попробовал это предложение, и он вернул $ typeInfo = 'int (11)' для каждого элемента в списке.

Jayrox 06.10.2008 12:08

Вот почему я написал в конце часть «Дополнительно ...». В любом случае, проверьте код, я поставил там чек. Однако вам все еще нужно решить, что вы хотите делать с пустыми строками.

pilsetnieks 06.10.2008 12:25

Хорошо, ну, очевидно, вам нужно преобразовать эти вещи обратно в строку, чтобы сравнить их, иначе исходная строка будет преобразована в число при сравнении.

pilsetnieks 06.10.2008 12:32

Я начинаю думать, что, возможно, мне придется пойти другим путем с выбором типа. например: if (preg_match ('/ [0-9] /', $ fieldList [$ i])) $ typeInfo = 'int (11)'; если (preg_match ('/[\.ght/', $ fieldList [$ i])) $ typeInfo = 'float'; if (preg_match ('/ [a-z] / i', $ fieldList [$ i])) $ typeInfo = 'varchar (80)';

Jayrox 06.10.2008 12:38
Ответ принят как подходящий

Основываясь на коде Модерн, вы могли бы сделать это

for($i = 0; $i <= count($fieldList); $i++)
{
    if (is_numeric($fieldList[$i]))
    {
        if (strpos($fieldList[$i],'.') !== false){
            $fieldList[$i] = (int)$fieldList[$i];
        }else{
            $fieldList[$i] = (float)$fieldList[$i];
        }
    }

    switch(gettype($fieldList[$i])) {
        case 'integer':
            $typeInfo = 'int(11)';
            break;
        case 'float':
        case 'double':
            $typeInfo = 'float';
            break;

        case 'string':
            $typeInfo = 'varchar(80)';
            break;
        default:
            $typeInfo = 'varchar(80)';
            break;
    }
if (gettype($fieldList[$i]) != NULL) echo "\t".'`'.$i.'` '.$typeInfo.' NOT NULL, --'.gettype($fieldList[$i]).' '.$fieldList[$i]."<br/>\n";

}

Это работает, обратите внимание на добавление «case 'double':» в переключателе, но может быть лучший способ выполнить проверку int / float, поскольку они будут работать только со стандартными номерами uk / us.

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

<?php

// GENERATE TABLE FROM FIRST LINE OF CSV FILE

$inputFile = 'file.csv';
$tableName = 'file_csv';

$fh = fopen($inputFile, 'r');
    $contents = fread($fh, 5120); // 5KB
fclose($fh);

$fileLines = explode("\n", $contents);

$fieldList = explode(',', $fileLines[0]);
echo 'CREATE TABLE IF NOT EXISTS `'.$tableName.'` ('."<br/>\n";
for($i = 0; $i <= count($fieldList); $i++)
{

    if (strlen($fieldList[$i]) == 0) $typeInfo = 'varchar(80)';
    if (preg_match('/[0-9]/', $fieldList[$i])) $typeInfo = 'int(11)';
    if (preg_match('/[\.]/', $fieldList[$i])) $typeInfo = 'float';
    if (preg_match('/[a-z\\']/i', $fieldList[$i])) $typeInfo = 'varchar(80)';

    echo "\t".'`'.$i.'` '.$typeInfo.' NOT NULL, -- '.gettype($fieldList[$i]).' '.$fieldList[$i]."<br/>\n";
}
echo '  PRIMARY KEY  (`0`)'."<br/>\n";
echo ') ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;';

Другие вопросы по теме