阅读多个上传的CSV文件php

时间:2017-06-01 09:32:24

标签: php csv file-upload

首先,我是法国人,请原谅我的英语! 我遇到了一个无法解决的问题。我有一个网站,允许我拖放多个CSV文件,但一次只处理一个文件。它与1个文件完美配合,它读取文件中的数据并显示高图表图形。我想显示几张来自多个CSV文件的图表,所有图片都以相同的方式编写。我设法做一个可以一次上传多个文件的拖放操作,它可以很好地解决这个问题:

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;

尽管我尝试了所有的尝试,但我仍然可以设法改变&#34;这段代码让它一次读取多个文件。 任何帮助将不胜感激 ! 谢谢

1 个答案:

答案 0 :(得分: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

希望有所帮助......