2014-09-15 4 views
2

Я импортирую файл csv в свою базу данных. Файл csv содержит более 30 столбцов. Проблема в том, что иногда клиент меняет индекс столбцов в файлах csv. Это означает, что для Ex. Имя в первую очередь, а Address находится во втором месте csv-файла, а иногда бывает, что имя находится во втором месте, а адрес - в первом месте. В данном сценарии мне нужно вручную проверить все поля csv, и я должен сделать это для многих других файлов csv, и это очень сложно сделать. Таким образом, я могу проверить столбцы csv в php и автоматически вставить их в базу данных mysql в нужном столбце. Это заданный способ импорта данных в базу данных по номерам индексов. Код не такой:Как проверить имя столбца csv с mysql colomn при импорте в базу данных mysql в php

while ($data = fgetcsv ($handle, 1000, ",")) 
{ 
if($dropdown1_value=="Canon") 
    { 
     $query="INSERT INTO `Import_CopiersandPrinters_Canon_Raw_Data` set `Account Name` 
       = '".htmlspecialchars($data[0],ENT_QUOTES)."', 
       `Account Number` = '".htmlspecialchars($data[1],ENT_QUOTES)."',`Does 
        Business As (DBA)` = '".htmlspecialchars($data[2],ENT_QUOTES)."', 
       `Shipping City` = '".htmlspecialchars($data[5],ENT_QUOTES)."', `Shipping 
        Zip Postal Code` = '".htmlspecialchars($data[6],ENT_QUOTES)."', 
        `Phone` = '".htmlspecialchars($data[7],ENT_QUOTES)."', 
        `Lease Term` = '".str_replace(")","",str_replace(" 
        (","-",str_replace(",","",str_replace("$","",$data[15]))))."', 
        `Lease Expiration Date` = '".htmlspecialchars($data[17],ENT_QUOTES)."', 
        `file_name` = '".$new_file_name."', `file_date` = '".date('Y-m-d 
        H:i:s')."'"; 

        mysql_query($query) or die(mysql_error()); 

        if (mysql_error() <> "") 
        {    
        fputcsv($output, $data); 
        $error_count++; 
        } 
        else 
        { 
        $row_count = $row_count + 1; 
        } 
       $total = $total+1; 
      } 
     } 
+0

Как вы знаете столбцы? Определено ли это в первом правиле CSV-файла? Если true, являются ли имена столбцов в CSV такими же, как имена столбцов в вашей таблице? –

+0

@ S.Pols Да имена столбцов определены в первом правиле файла CSV и имена столбцов в таблице, а имена столбцов в файле csv одинаковы. – Mukesh

+0

@ S.Pols Я немного поработал над этим, и теперь я могу получить имена столбцов таблицы mysql и имена столбцов csv, и я не понимаю, что делать дальше. – Mukesh

ответ

2

У вас может быть 2 подхода. Чтобы написать руководство по вашему запросу или использовать функцию implode. Я сделал для вас оба примера. Дайте мне знать, если вы не понимаете код или возникла ошибка. Я думаю, это сработает. Обратите внимание, что вы также должны добавить свой if($dropdown1_value=="Canon") чек.

Руководство approuch:

$columnArray = array(); 
$dataArray  = array(); 
$firstRule  = true; 

while ($data = fgetcsv ($handle, 1000, ",")) 
{ 
    if($firstRule) 
    { 
     foreach($data as $columnName) 
     { 
      $columnArray[] = $columnName; 
     } 

     $firstRule = false; 
    } 
    else 
    { 
     $rule = array(); 
     for($i = 0; $i < count($data) ; $i++) 
     { 
      $rule[$columnArray[$i]] = $data[$i]; 
     } 
     $dataArray[] = $rule; 
    } 
} 

foreach($dataArray as $data) 
{ 
    $query="INSERT INTO `Import_CopiersandPrinters_Canon_Raw_Data` set `Account Name` 
      = '".htmlspecialchars($data['Account Name'],ENT_QUOTES)."', 
      `Account Number` = '".htmlspecialchars($data[1],ENT_QUOTES)."', 
      `Does Business As (DBA)` = '".htmlspecialchars($data['Does Business As (DBA)'],ENT_QUOTES)."', 
      `Shipping City` = '".htmlspecialchars($data['Shipping City'],ENT_QUOTES)."', 
      .... 
      .... 
      .... 
      `file_name` = '".$new_file_name."', 
      `file_date` = '".date('Y-m-d H:i:s')."'"; 

    mysql_query($query) or die(mysql_error()); 

    //Note that this would't reach when an error occured, because you used `or die`. You should use `or print` when you want to continue your code 
    if (mysql_error() <> "") 
    {    
     fputcsv($output, $data); 
     $error_count++; 
    } 
    else 
    { 
     $row_count = $row_count + 1; 
    } 

    $total = $total+1; 
} 

implode approuch:

function convert($string) 
{ 
    return htmlspecialchars($string,ENT_QUOTES); 
} 

$columnArray = array(); 
$dataArray  = array(); 
$firstRule  = true; 

while ($data = fgetcsv ($handle, 1000, ",")) 
{ 
    if($firstRule) 
    { 
     foreach($data as $columnName) 
     { 
      $columnArray[] = $columnName; 
     } 

     $firstRule = false; 
    } 
    else 
    { 
     $rule = array(); 
     for($i = 0; $i < count($data) ; $i++) 
     { 
      $rule[$columnArray[$i]] = $data[$i]; 
     } 
     $dataArray[] = $rule; 
    } 
} 

foreach($dataArray as $data) 
{ 
    $query = "INSERT INTO `Import_CopiersandPrinters_Canon_Raw_Data` (`".implode('`,`', array_keys($data))."`, `file_name`, `file_date`) VALUES('".implode('\',\'', array_map("convert",array_values($data)))."', '".$new_file_name."', '".date('Y-m-d H:i:s')."')"; 

    mysql_query($query) or die(mysql_error()); 

    //Note that this would't reach when an error occured, because you used `or die`. You should use `or print` when you want to continue your code 
    if (mysql_error() <> "") 
    {    
     fputcsv($output, $data); 
     $error_count++; 
    } 
    else 
    { 
     $row_count = $row_count + 1; 
    } 

    $total = $total+1; 
} 
+0

Большое вам спасибо за это. Я реализую его, но данные не вставляются в базу данных. Может быть, я ошибаюсь. Я реализую его, и я дам вам знать. – Mukesh

+0

Какой подход вы использовали? –

+0

@ Первый, ручной подход. – Mukesh

Смежные вопросы