2017-06-01 63 views
0

首先,我是法国人,请原谅我的英语! 我遇到了一个我无法解决的问题。我有一个网站,允许我拖放多个CSV文件,但一次只能处理一个文件。它可以与1个文件完美协作,它读取文件中的数据并显示高图表图形。我想显示来自多个CSV文件的多个图表,全部以相同的方式编写。我能做到这可以同时上传多个文件一拖和拖放,和它的作品besauce我得到这个:阅读多个上传的CSV文件php

Array ([name] => Array ([0] => 14-04-2014 (1).csv [1] => 14-04-2014.csv) [type] => Array ([0] => text/csv [1] => text/csv) [tmp_name] => Array ([0] => /tmp/phpbQZ7NI [1] => /tmp/phptvEwXI) [error] => Array ([0] => 0 [1] => 0) [size] => Array ([0] => 589 [1] => 589)) 

在另一方面,我不能设法处理在这些文件循环。

下面是一个文件中的代码,没有环:

if (($fichier = fopen("upload/".$_FILES['file']['name'], "r")) !== FALSE) { 

$oui_total = 0; 
$non_total = 0; 

$tab_oui = array(); 
$tab_non = array(); 
$tab_sat = array(); 

$tableau = array(); 

$date = null; 

$id_borne= null; 


while (($data = fgetcsv($fichier,0, ",")) !== FALSE) { //on lit ligne par ligne dans cette boucle ! 

    //on lit l'ID de la borne s'il existe 
    if ((mb_strimwidth($data[0], 0, 4,'') != "2014") 
     AND (mb_strimwidth($data[0], 0, 4,'') != "2015") 
     AND (mb_strimwidth($data[0], 0, 4,'') != "2016") 
     AND (mb_strimwidth($data[0], 0, 4,'') != "2017") 
     AND (mb_strimwidth($data[0], 0, 4,'') != "2018") 
     AND (mb_strimwidth($data[0], 0, 4,'') != "2019")) 
     { 
     $id_borne=$data[0]; 
    } 
    elseif ($date === null) { 
     $date = mb_strimwidth($data[0], 0, 10,''); 
    } 

    // sauter les lignes vides 
    if ($data[0] === null) { 
     continue; 
    } 

    // pour écrire le sous-titre du graphe 
    if (strlen($data[O]) > 5 && $date === null) 

    // parser l'heure et la date 
    $data[0] = trim($data[0]); 
    $format_date = preg_match(
     '~ 
      (?P<year> \d+) - 
      (?P<month> \d+) - 
      (?P<day> \d+) \h+ 
      (?P<hour> \d+) : 
      (?P<minute> \d+) : 
      (?P<second> \d+) 
     ~x', 
     $data[0], 
     $match 
    ); 

    //if ($format_date == false) { 
    // exit("Le fichier csv n'a pas le format attendu: la date devrait être \"yyyy-mm-dd hh:mm:ss\"."); 
    //} 


    // Par défaut : heure d'hiver. Donc on a les bons horaires du 25 oct au 29 mars. 
    // ete : 29 mars et + 
    // hiver : 25 octobre et + 
    // '$ete' vaut 'true' si la date du CSV est en été 
    $ete = ((intval($match['month']) > 3 && intval($match['month']) < 10) 
     || (intval($match['month']) === 3 && intval($match['day']) > 28) 
     || (intval($match['month']) === 10 && intval($match['day']) < 25)); 

    $correctif_heure = $ete === true ? 1 : 0; 

    // on stocke l'information dans un tableau avec l'heure en minutes pour clef (exemple: 8*60+15=495 pour 8h15) 
    $heure_en_minute = (intval($match['hour']) + $correctif_heure) * 60 + intval($match['minute']); 
    $tableau[$heure_en_minute] = array(
     'oui' => intval($data[1]), 
     'non' => intval($data[2]), 
     'sat' => ceil($data[1]/($data[1] + $data[2]) * 100) 
    ); 

    $oui_total += $data[1]; 
    $non_total += $data[2]; 
} 

    fclose($fichier); 
} 
else { 
    exit(TXT_IMPOSSIBLE); 
} 

unlink($dossier . $_FILES['file']['name']); 

$total = $oui_total + $non_total; 
$sat_total = ceil($oui_total/$total * 100); 
$unsat_total = 100 - $sat_total; 

尽管我所有的尝试,我可以管理“改造”这个代码,它同时读取多个文件。 任何帮助将不胜感激! 谢谢

+0

您可以使用foreach循环为 –

+0

@AdhanTimothyYounes是的,我已经试过了,但我一定是做错了,因为它没有工作。我不知道如何将数据“转换”为表格。我可以发布我所做的,所以你可以告诉我我做错了什么? – CamilleKah

回答

0

我觉得这个问题已经在这里回答了SO。你所要做的就是循环每个上传的文件。

<?php 
$total = count($_FILES['file']['name']); 

// Loop through each file 
for($i=0; $i<$total; $i++) { 
    // Get the temp file path 
    $tmpFilePath = $_FILES['file']['tmp_name'][$i]; 

    //Make sure we have a filepath 
    if ($tmpFilePath != ""){ 
    //Setup our new file path 
    $newFilePath = "./upload/" . $_FILES['file']['name'][$i]; 
    //Upload the file into the temp dir 
    if(move_uploaded_file($tmpFilePath, $newFilePath)) { 
     //Handle other code here 
     if (($fichier = fopen("upload/".$_FILES['file']['name'][$i], "r")) !== FALSE) { 
     $oui_total = 0; 
     $non_total = 0; 

     $tab_oui = array(); 
     $tab_non = array(); 
     $tab_sat = array(); 

     $tableau = array(); 

     // more code below... 
     // ... 
     } 
    } 
    } 
} 

检查此链接给你更多的了解:
Multiple file upload in php
http://php.net/manual/en/features.file-upload.multiple.php

希望它可以帮助..

+0

感谢您的回答! 我没有试过,但我的一个文件的数据必须是几个文件的权利表? – CamilleKah

+0

welcome..hope最多可以投我answr ..谢谢:) –

+0

对此深感抱歉,我没有完成录音,但我按Enter键就到了线和评论做了职,所以你可以看看我的编辑的第一评论请 ? :) – CamilleKah

0

这就是我所做的:

$valid_formats = array("csv", "CSV"); 
//$max_file_size = 1024*100; //100 kb 
$path = "upload/"; // Upload directory 
$count = 0; 

if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){ 
    // Loop $_FILES to exeicute all files 
    foreach ($_FILES['files']['name'] as $f => $name) { 
    if (!empty($_FILES['files'][$f])) { 
     if ($_FILES['files']['error'][$f] == 4) { 
      exit('Erreur n°' . $_FILES['files']['error'][$f]); 
     } 
     if ($_FILES['files']['error'][$f] == 0) { 
      if (!in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats)) { 
       //$message[] = "$name is not a valid format"; 
       continue; // Skip invalid file formats 
      } else { // No error found! Move uploaded files 
       if (is_uploaded_file($_FILES['files']['tmp_name'][$f])) { 
        if (move_uploaded_file($_FILES["files"]["tmp_name"][$f], $path . $name)){ 

         // pendant le dev: 
         //if (($fichier = fopen("upload/14-11-2014 (5).csv", "r")) !== FALSE) { 
         if (($fichier[$f] = fopen($path.$_FILES['files']['name'][$f], "r")) !== FALSE) { 

          $oui_total[$f] = 0; 
          $non_total[$f] = 0; 

          $tab_oui[$f] = array(); 
          $tab_non[$f] = array(); 
          $tab_sat[$f] = array(); 

          $tableau[$f] = array(); 

          $date[$f] = null; 

          $id_borne[$f]= null; 

          var_dump($fichier[$f]); 
          while (($data[$f] = fgetcsv($fichier[$f],0, ",")) !== FALSE) { //on lit ligne par ligne dans cette boucle ! 

           var_dump($data[$f]); 
           //on lit l'ID. 
           if ((mb_strimwidth($data[$f][0], 0, 4,'') != "2014") 
            AND (mb_strimwidth($data[$f][0], 0, 4,'') != "2015") 
            AND (mb_strimwidth($data[$f][0], 0, 4,'') != "2016") 
            AND (mb_strimwidth($data[$f][0], 0, 4,'') != "2017") 
            AND (mb_strimwidth($data[$f][0], 0, 4,'') != "2018") 
            AND (mb_strimwidth($data[$f][0], 0, 4,'') != "2019")) 
           { 
            $id_borne[$f]=$data[$f][0]; 
           } 
           elseif ($date[$f] === null) { 
            $date[$f] = mb_strimwidth($data[$f][0], 0, 10,''); 
           } 

           // sauter les lignes vides 
           if ($data[$f][0] === null) { 
            continue; 
           } 

           // pour écrire le sous-titre du graphe 
           if (strlen($data[$f][O]) > 5 && $date[$f] === null) 

            // parser l'heure et la date 
            $data[$f][0] = trim($data[$f][0]); 
           $format_date[$f] = preg_match(
            '~ 
            (?P<year> \d+) - 
            (?P<month> \d+) - 
            (?P<day> \d+) \h+ 
            (?P<hour> \d+) : 
            (?P<minute> \d+) : 
            (?P<second> \d+) 
           ~x', 
            $data[$f][0], 
            $match[$f] 
           ); 

           //if ($format_date == false) { 
           // exit("Le fichier csv n'a pas le format attendu: la date devrait être \"yyyy-mm-dd hh:mm:ss\"."); 
           //} 


           // Par défaut nos bornes sont en heure d'hiver. Donc on a les bons horaires du 25 oct au 29 mars. 
           // ete : 29 mars et + 
           // hiver : 25 octobre et + 
           // '$ete' vaut 'true' si la date du CSV est en été 
           $ete[$f] = ((intval($match[$f]['month']) > 3 && intval($match[$f]['month']) < 10) 
            || (intval($match[$f]['month']) === 3 && intval($match[$f]['day']) > 28) 
            || (intval($match[$f]['month']) === 10 && intval($match[$f]['day']) < 25)); 

           $correctif_heure[$f] = $ete[$f] === true ? 1 : 0; 

           // on stocke l'information dans un tableau avec l'heure en minutes pour clef (exemple: 8*60+15=495 pour 8h15) 
           $heure_en_minute[$f] = (intval($match[$f]['hour']) + $correctif_heure[$f]) * 60 + intval($match[$f]['minute']); 
           $tableau[$f][$heure_en_minute] = array(
            'oui' => intval($data[$f][1]), 
            'non' => intval($data[$f][2]), 
            'sat' => ceil($data[$f][1]/($data[$f][1] + $data[$f][2]) * 100) 
           ); 

           $oui_total[$f] += $data[$f][1]; 
           $non_total[$f] += $data[$f][2]; 
          } 

          fclose($fichier[$f]); 
         } 
         else { 
          exit(TXT_IMPOSSIBLE); 
         } 

         unlink($path . $_FILES['files']['name'][$f]); 

         $total[$f] = $oui_total[$f] + $non_total[$f]; 
         $sat_total[$f] = ceil($oui_total[$f]/$total[$f] * 100); 
         $unsat_total[$f] = 100 - $sat_total[$f]; 


        }else{ 
         exit('Erreur lors de l\'enregistrement'); 
        } 
        $count++; // Number of successfully uploaded file 
       } 
       else { 
        exit('Fichier non uploadé'); 
       } 
      } 
     } 
    } 
} 

但是,没没有工作,或者我失去了一些东西,因为所有数据是空

+0

hm ..什么是您的14-04-2014.csv的示例数据? –

+0

有,3个colums,一个日期和时间,一个以“赞成”票的数量,最后以“没有”投票 1号线:2014年4月14日08:30:00/5/2; 第二行:2014-04-14 09:00:00/17/3; – CamilleKah