PHP를 사용하여 CSV 파일의 첫 번째 줄을 가져 와서 데이터와 함께 MySQL 테이블을 만듭니다.

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

  •  05-07-2019
  •  | 
  •  

문제

다소 큰 CSV 파일을 가져 와서 프로젝트를 참조하기 위해 MySQL 데이터베이스에 삽입하려고합니다. 파일의 첫 번째 줄을 사용하여 각 열에 대한 Varchar가 아닌 적절한 데이터 유형을 사용하여 테이블을 작성하고 싶습니다. 궁극적 인 목표는 몇 가지 유사한 파일이 있지만 CSV 파일에 다른 데이터와 다른 양의 "열"을 가지고 있으므로이 프로세스를 자동화하는 것입니다. 내가 가지고있는 문제는 gettype ()가 원하는대로 int, float 및 string 대신 각 열에 대해 '문자열'을 반환하는 것입니다.

플랫폼은 PHP 5, OS는 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.000000,0.000000,0,0,0, 0,0,1,0,50, ' 리콜 단어 (old) ',

도움이 되었습니까?

해결책

빌딩 누보당신은 이것을 할 수 있습니다

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':"추가가 추가되지만 Standard UK/US 숫자만으로 작동하므로 int/float 검사를 수행하는 더 나은 방법이있을 수 있습니다.

다른 팁

값을 캐스팅하고 원본과 비교해보십시오.

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