For和For in CSV按列名称导入

时间:2017-06-26 13:17:58

标签: php mysql csv

我有一个脚本,我上传一个CSV文件,它读取列名和特定行列中的值。这是因为我想像

一样添加它们

行nr,行1值,行3标题,行3值 例如:

row_nr,part_nr,length,width 1,GL 3000,2000 2,FD 2500,1500

所以我将在这样的表格中插入:

1,GL,长度,3000 1,GL,宽度,2000 2,FD,长度,2500 2,FD,宽度,1500

依旧......

问题是我不知道访问者会有多少列,所以我需要一段时间,或者我不想在极限下手动定义。

 <?php
include 'db_xls.php';

$cookie_name = "Draft ID";
$cookie_value = "John Doe";
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day


$date = date_create();
$timestamp=date_timestamp_get($date);
echo $timestamp;
if(isset($_POST["Import"])){


        echo $filename=$_FILES["file"]["tmp_name"];

        }


$row = 1;
if (($handle = fopen("$filename", "r")) !== FALSE)
{
    echo '<table>';

    // Get headers
    if (($data = fgetcsv($handle, 1000, ',')) !== FALSE)
    {
        //$cap_tabel=array($data);



        $cota0=$data[0];
        $cota1=$data[1];
        $cota2=$data[2];
        $cota3=$data[3];
        $cota4=$data[4];
        $cota5=$data[5];
        $cota6=$data[6];
        $cota7=$data[7];
        $cota8=$data[8];
        $cota9=$data[9];
        $cota10=$data[10];
        $cota11=$data[11];
        $cota12=$data[12];
        $cota13=$data[13];
        $cota14=$data[14];
        $cota15=$data[15];
        $cota16=$data[16];
        $cota17=$data[17];
        $cota18=$data[18];
        $cota19=$data[19];
        $cota20=$data[20];
        $cota21=$data[21];
        $cota22=$data[22];
        $cota23=$data[23];
        $cota24=$data[24];
        $cota25=$data[25];
        $cota26=$data[26];
        $cota27=$data[27];
        $cota28=$data[28];
        $cota29=$data[29];
        $cota30=$data[30];
        $cota31=$data[31];
        $cota32=$data[32];
        $cota33=$data[33];
        $cota34=$data[34];
        $cota35=$data[35];
        $cota36=$data[36];
        $cota37=$data[37];
        $cota38=$data[38];
        $cota39=$data[39];
        $cota40=$data[40];
        $cota41=$data[41];
        $cota42=$data[42];
        $cota43=$data[43];
        $cota44=$data[44];
        $cota45=$data[45];
        $cota46=$data[46];
        $cota47=$data[47];
        $cota48=$data[48];
        $cota49=$data[49];
        $cota50=$data[50];
    }
    $rand=0;
    // Get the rest
    while (($data = fgetcsv($handle, 1000, ',')) !== FALSE)
    {

        //echo '<tr><td>'.implode('</td><td>', $data).'</td></tr>';

        $rand=$rand+1;
        echo '<tr><td>rand:'.$rand.'</td>';
        echo '<tr><td>'.$cota0.':'.$data[0].'</td>';
        echo '<tr><td>'.$cota1.':'.$data[1].'</td>';


echo "<hr>";        
        echo '<tr><td>rand:'.$rand.'</td>';
        echo '<tr><td>'.$cota0.':'.$data[0].'</td>';
        echo '<tr><td>'.$cota2.':'.$data[2].'</td>';



echo "<hr>";        
        echo '<tr><td>rand:'.$rand.'</td>';
        echo '<tr><td>'.$cota0.':'.$data[0].'</td>';
        echo '<tr><td>'.$cota3.':'.$data[3].'</td>';


        /*

        echo 'RAND:'.$rand.'</br>';
        echo 'COD PIESA'.$data[0].'</br>';
        echo ''.$cota1.':'.$data[1].'</br>';
        echo ''.$cota2.':'.$data[2].'</br>';
        echo ''.$cota3.':'.$data[3].'</br>';
        echo ''.$cota4.':'.$data[4].'</br>';
        echo ''.$cota5.':'.$data[5].'</br>';
        echo ''.$cota6.':'.$data[6].'</br>';
        echo ''.$cota7.':'.$data[7].'</br>';
        echo ''.$cota8.':'.$data[8].'</br>';
        echo ''.$cota9.':'.$data[9].'</br>';
        echo ''.$cota10.':'.$data[10].'</br>';*/

        //  $sInsertSql = "INSERT INTO `r45815ar_zeu`.`z_fab_importdraft` (`z_fab_imp_draftID`, `add_ip`, `add_id`, `add_datetime`, `user_id`, `amount`, `currency`, `item`, `transaction_status`, `external_transaction_id`, `transaction_type`) VALUES (NULL, '$add_ip', '$user_id', '$add_datetime', '$user_id', '$amount', '$currency', '$item_number', '$status_tranzaction', '$id_tranzaction_extern', 'Deposit')";
//$GLOBALS["conn"]->Execute($sInsertSql);
    }
    fclose($handle);
    //echo '</table>';
}
?>

是否可以帮我添加一个for或while for header以及列名和值,保留行号和部件号,就像我的例子一样?

谢谢!

5 个答案:

答案 0 :(得分:1)

根据您在下面的回答,您似乎只需要读取CSV文件并将其插入数据库表:

<?php
$file = "your.csv";
$body = [];

if (($handle = fopen($file, "r")) !== FALSE) {
  while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
     $body[] = $data;
  }
  fclose($handle);
}

$sqlData = serialize($body);
$query = "INSERT INTO files (data) VALUES(${sqlData});";
// execute query...

答案 1 :(得分:0)

这是CSV样式:

COD_PIESA   LUNGIME LATIME  GROSIME CANTITATE   UM
GL          1500    500     50      1           BUC
FD          1600    600     60      2           ROLE
MM          1700    700     70      3           KG
TL          1800    800     80      4           M3

我想插入SQL,如:

ROW COD_PIESA   COLUMN      VALUE
1   GL          LUNGIME     1500
1   GL          LATIME      500
1   GL          GROSIME     50
1   GL          CANTITATE   1
1   GL          UM          BUC
2   FD          LUNGIME     1600
…   …           …           …

答案 2 :(得分:0)

谢谢Javier,

我已经设法对它进行排序,但说实话太多了,不能手工制作。如果我将它留给50行最大列数,我可以手工完成。它完美地工作,但我有太多的插入:

    if (($handle = fopen("$filename", "r")) !== FALSE)
{
    echo '<table>';

    // Get headers
    if (($data = fgetcsv($handle, 1000, ',')) !== FALSE)
    {
        //$cap_tabel=array($data);




        $cota0=$data[0];
        $cota1=$data[1];
        $cota2=$data[2];
        $cota3=$data[3];
        $cota4=$data[4];
        $cota5=$data[5];
        $cota6=$data[6];
        $cota7=$data[7];
        $cota8=$data[8];
........
$cota50=$data[50];
    }
    $rand=0;
    // Get the rest
    while (($data = fgetcsv($handle, 1000, ',')) !== FALSE)
    {

//coloana 1
        $rand=$rand+1;
        echo '<tr><td>rand:'.$rand.'</td>';
        $piesa=$data[0];
        $cota=$cota1;
        $valoare_cota=$data[1];

echo '<tr><td>ROW:'.$rand.'</td>';
echo '<tr><td>PART:'.$piesa.'</td>';
echo '<tr><td>'.$cota.':'.$valoare_cota.'</td>';

        //add coloana 1


    $coloana1 = "INSERT INTO `r45815ar_zeu`.`z_fab_importdraft`
    (`z_fab_imp_recID`, `z_fab_imp_draftID`, `z_fab_imp_UserID`, `z_fab_imp_AddDT`, `z_fab_imp_Rand`, `z_fab_imp_Piesa`, `z_fab_imp_Cota`, `z_fab_imp_Valoarea`) VALUES
    (NULL, '$draft_ID', '$user_id', '$date_time', '$rand', '$piesa', '$cota', '$valoare_cota')";


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



//if column 2 exists
//coloana 2

$cota=$cota2;
$valoare_cota=$data[2];

if ($cota!='')

{

$coloana2 = "INSERT INTO `r45815ar_zeu`.`z_fab_importdraft`
    (`z_fab_imp_recID`, `z_fab_imp_draftID`, `z_fab_imp_UserID`, `z_fab_imp_AddDT`, `z_fab_imp_Rand`, `z_fab_imp_Piesa`, `z_fab_imp_Cota`, `z_fab_imp_Valoarea`) VALUES
    (NULL, '$draft_ID', '$user_id', '$date_time', '$rand', '$piesa', '$cota', '$valoare_cota')";


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

echo 'insert col 2';
}
else
{
echo "empty col 2";    }


//daca exista coloana 3
//coloana 3

$cota=$cota3;
$valoare_cota=$data[3];

if ($cota!='')

{

$coloana3 = "INSERT INTO `r45815ar_zeu`.`z_fab_importdraft`
    (`z_fab_imp_recID`, `z_fab_imp_draftID`, `z_fab_imp_UserID`, `z_fab_imp_AddDT`, `z_fab_imp_Rand`, `z_fab_imp_Piesa`, `z_fab_imp_Cota`, `z_fab_imp_Valoarea`) VALUES
    (NULL, '$draft_ID', '$user_id', '$date_time', '$rand', '$piesa', '$cota', '$valoare_cota')";


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

echo 'insert col 3';
}
else
{
echo "empty col 3";
}

这将按照我的意愿工作,问题是我定义了太多的插入等,没有使用一段时间或我无法弄清楚放在哪里。

答案 3 :(得分:0)

我只是想添加一个答案,因为我确定谷歌会为此编制索引,并且会有人搜索此类搜索解决方案。

这是一个PHP脚本,当您尝试上载CSV文件并创建列表而不是列导入时,该脚本有效。 它将第一列和行号保留为参考,以备将来使用。您可能有一个组件列表,因此您需要行号,以防它们重复。

您可以使用它来创建一个包含组件和规格的表格,例如宽度,深度,厚度或列中的任何内容。

John的回答在网上研究了几天和几天后解决了我的问题所以我想为此给予他所有的信任。

出色的工作!谢谢!

答案 4 :(得分:-1)

我在fb上贴了你的要点, 看看它。 gist

它基于您在fb上提供的信息。 一旦你解析了csv文件,你需要做的就是循环数据并根据需要制作sql语句。

我不认为你不会知道col名称或者多少,不应该努力!

csv_to_array()功能

之后
/**
 * Example
 */
$contents = csv_to_array('example.csv');

/**
 * DEBUG
*/ 
echo "<pre>";
print_r($contents);
echo "</pre>";

// generate your temp Id for the inserts, 
$tempId = uniqid('', false);

// loop thru the data
foreach ($contents as $k=>$v){

    //Optional -  clean up whitespaces in the array keys
    $keys = str_replace(' ', '', array_keys($contents[$k]));

    $contents[$k] = array_combine($keys, array_values( $contents[$k]));

    // no need to manipulate the array, only need to know what you need to insert
    $cod_piesa = $contents[$k]['cod_piesa'];

    // dont need this anymore
    unset($contents[$k]['cod_piesa']);

    // now loop thru the headers
    foreach($contents[$k] as $header => $value){
        // white spaces again 
        $value = trim($value);
        //make the statements   
        $sql = "INSERT INTO tbl_drafts (draft_id, row, cod_piesa, header, value)
                                VALUES ('$tempId', '$k', '$cod_piesa', '$header', '$value');";

        // execute your statment...

        /**
         * DEBUG
         */
         echo "$sql <br>";
    }
}
// redirect for review with header()