Mit PHP der ersten Zeile einer CSV-Datei zu übernehmen und eine MySQL-Tabelle mit den Daten erstellen

StackOverflow https://stackoverflow.com/questions/173498

  •  05-07-2019
  •  | 
  •  

Frage

Ich versuche, eine ziemlich große CSV-Datei zu nehmen und es in eine MySQL-Datenbank einfügen in einem Projekt zur Referenzierung. Ich mag die erste Zeile der Datei verwenden, um die Tabelle mit richtigen Datentypen und nicht varchar für jede Spalte zu erstellen. Das ultimative Ziel ist es, diesen Prozess zu automatisieren, wie ich mehrere ähnliche Dateien haben aber die jeweils unterschiedliche Daten und eine unterschiedliche Menge an „Spalten“ in CSV-Dateien. Das Problem, das ich habe, ist gettype () für jede Spalte statt int, float und string ‚string‘ zurückkehrt, wie Ich mag würde es.

Platform ist PHP 5, O ist Ubuntu 8.04

Hier ist mein Code so weit:

<?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 ;';

Beispiel Erste Zeile:     1,0,0,0,0,0,0,0,0,0,0,0,0.000000,0.000000,0,0,0, 0,0,1,0,50, "Word of Recall ( OLD)‘,

War es hilfreich?

Lösung

Aufbauend auf Nouveau 's-Code können Sie dies tun

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";

}

Das ist, beachten Sie die Zugabe von „Fall‚doppelte‘:“ arbeitet in dem Schalter, aber es kann eine bessere Möglichkeit, die int / Schwimmerprüfung zu tun, wie sie nur mit Standard-uk / us Zahlen funktionieren würden

Andere Tipps

Versuchen Sie, den Wert des Gießen und vergleicht es mit dem Original:

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;
}

Additionaly, Überprüfung auf das Vorhandensein von Dezimalzeichen im ersten Fall für die Zahlen, die rund sind, aber sie haben den dezimalen Bruchteil.

<?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 ;';

Verwenden von regulären Ausdrücken werden Sie eine flexible Lösung. Wenn Sie Datumsfelder erfassen müssen, dann ist dies der Weg zu gehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top