باستخدام PHP لاتخاذ السطر الأول من ملف CSV وإنشاء جدول الخلية مع البيانات

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

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا أحاول أن تأخذ ملف CSV كبير نوعا ما، وأدخله في قاعدة بيانات MySQL عن الرجوع في المشروع. وأود أن استخدام السطر الأول من الملف لإنشاء جدول باستخدام أنواع البيانات الصحيحة وليس VARCHAR لكل عمود. والهدف النهائي هو لأتمتة هذه العملية كما قلت عدة ملفات مماثلة ولكن كل لديه بيانات مختلفة وكمية مختلفة من "أعمدة" في ملفات CSV. المشكلة أن أواجه هو gettype () تعود 'سلسلة' لكل عمود بدلا من كثافة، تطفو وسلسلة كما أود أن.

ومنصة هو PHP 5، هو نظام التشغيل أوبونتو 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، "كلمة إستدعاء ( OLD) '،

هل كانت مفيدة؟

المحلول

وبناء على <لأ href = "https://stackoverflow.com/questions/173498/using-php-to-take-the-first-line-of-a-csv-file-and-create-a- ك-الجدول مع ال # 173526 "> الحديث الصورة الرمز الذي يمكن أن تفعله هذه

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

}

وهذا يعمل، لاحظ إضافة "حالة" المزدوج ":" في التبديل، ولكن قد يكون هناك طريقة أفضل للقيام الاختيار الباحث / تعويم لأنها تعمل فقط مع معيار المملكة المتحدة / لنا أرقام

نصائح أخرى

وحاول صب قيمة ومقارنتها مع الأصل واحد:

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

وأديتيونالي، تحقق من وجود الفاصل العشري في الحالة الأولى للأرقام التي هي الجولة، ولكن لديهم جزء كسر عشري.

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

وسوف تستخدم التعابير العادية تعطيك حلا مرنا. إذا كنت بحاجة إلى اكتشاف حقول التاريخ ثم وهذا هو الطريق للذهاب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top