Mysql
 sql >> Base de données >  >> RDS >> Mysql

Travailler avec des pointeurs de fichiers sur un csv

  1. Est fgets() le meilleur à utiliser pour cela ? C'est une belle façon de faire. Une autre option consiste à lire le fichier entier dans un tableau avec file() , puis bouclez sur le tableau avec foreach() .

  2. Dois-je intégrer un rappel ? Non. Effectuez simplement la requête après avoir lu chaque lot de lignes du fichier.

  3. Par où commencer ? Lorsque le compteur atteint la taille du lot, exécutez la requête. Remettez ensuite le compteur à 0 et redéfinissez la chaîne de requête sur la valeur initiale. Enfin, à la fin de la boucle, vous devrez effectuer la requête avec les valeurs restantes (sauf si la taille du fichier était un multiple exact de la taille du lot, auquel cas il ne restera rien).

$batch_size = 100;
$counter = 0;

//instead of executing query one by one,
//let us prepare 1 SQL query that will insert all values from the batch

$sql_prefix ="INSERT INTO workorderstest(id,parentid,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10) VALUES ";
$values = "";

while (($line = fgets($handle)) !== false) {
    $values .= "($line),";
    $counter++;
    if ($counter == $batch_size) {
        $values = substr($values, 0, strlen($values) - 1);
        $conn->query($sql_prefix . $values) or die($conn->error);
        $counter = 0;
        $values ="";
    }
}
if ($counter > 0) { // Execute the last batch
    $values = substr($values, 0, strlen($values) - 1);
    $conn->query($sql_prefix . $values) or die($conn->error);
}