web-dev-qa-db-fra.com

Importer des données CSV avec PHP / MySQL

J'ai quelques difficultés à importer des données à partir d'un fichier CSV et à poser quelques questions que je n'ai pas encore réussi à résoudre moi-même.

Tout d’abord, voici mon code pour aider à mettre les choses en perspective (le nettoie un peu, en supprimant les connexions CSS et DB):

<body>
<div id="container">
<div id="form">

<?php
$deleterecords = "TRUNCATE TABLE tablename"; //empty the table of its current records
mysql_query($deleterecords);

//Upload File
if (isset($_POST['submit'])) {

    if (is_uploaded_file($_FILES['filename']['tmp_name'])) {
        echo "<h1>" . "File ". $_FILES['filename']['name'] ." uploaded 
 successfully." . "</h1>";
        echo "<h2>Displaying contents:</h2>";
        readfile($_FILES['filename']['tmp_name']);
    }

    //Import uploaded file to Database
    $handle = fopen($_FILES['filename']['tmp_name'], "r");

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $import="INSERT into importing(text,number)values('$data[0]','$data[1]')";

        mysql_query($import) or die(mysql_error());
    }

    fclose($handle);

    print "Import done";

//view upload form
} else {

    print "Upload new csv by browsing to file and clicking on Upload<br />\n";

    print "<form enctype='multipart/form-data' action='upload.php' method='post'>";

    print "File name to import:<br />\n";

    print "<input size='50' type='file' name='filename'><br />\n";

    print "<input type='submit' name='submit' value='Upload'></form>";

}

?>

</div>
</div>
</body>

C'est fondamentalement une adaptation d'un exemple que j'ai trouvé après de nombreuses tentatives de méthodes différentes.

Mon CSV a deux colonnes de données, la première étant du texte et la seconde des entiers. Le tableau de la base de données comporte également deux colonnes, la première appelée "texte" et la seconde "numéro".

Donc les questions que j'ai sont:

  1. le texte en cours de téléchargement est simplement affiché en tant que 0 dans chaque champ et je ne sais pas pourquoi
  2. Je continue à lire à propos des données qui finissent entre "", si cela se produit, comment pourrais-je les trier?
  3. comment puis-je ignorer les X premières lignes du fichier CSV pour les en-têtes, etc.?
  4. le format de données a-t-il changé tout au long de ce processus ou est-il prêt à être utilisé dans un graphique? par exemple. une décimale resterait-elle une décimale une fois placée dans la base de données?

Je pense que cela couvre tout, merci d'avance pour toute aide!

MODIFIER:

Je viens de faire un test de 10 000 envois d’enregistrements et l’erreur suivante:

"Erreur fatale: temps d'exécution maximal dépassé de 30 secondes"

des pensées?

26
Pidge

L’autre jour, j’ai répondu à une question pratiquement identique: enregistrer des fichiers CSV dans la base de données mysql

MySQL a une fonctionnalité LOAD DATA INFILE, qui lui permet d'importer un fichier CSV directement dans une requête SQL unique, sans qu'il soit nécessaire de le traiter en boucle via votre programme PHP).

Exemple simple:

<?php
$query = <<<eof
    LOAD DATA INFILE '$fileName'
     INTO TABLE tableName
     FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
     LINES TERMINATED BY '\n'
    (field1,field2,field3,etc)
eof;

$db->query($query);
?>

C'est aussi simple que ça.

Pas de boucles, pas de chichi. Et beaucoup beaucoup plus rapide que de l’analyser en PHP.

Page de manuel MySQL ici: http://dev.mysql.com/doc/refman/5.1/en/load-data.html

J'espère que ça t'as aidé

67
SDC
$i=0;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if($i>0){
    $import="INSERT into importing(text,number)values('".$data[0]."','".$data[1]."')";
    mysql_query($import) or die(mysql_error());
}
$i=1;
}
6
jit
set_time_limit(10000);

$con = mysql_connect('127.0.0.1','root','password');
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("db", $con);

$fp = fopen("file.csv", "r");

while( !feof($fp) ) {
  if( !$line = fgetcsv($fp, 1000, ';', '"')) {
     continue;
  }

    $importSQL = "INSERT INTO table_name VALUES('".$line[0]."','".$line[1]."','".$line[2]."')";

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

}

fclose($fp);
mysql_close($con);
2
dzeno

letsay $ infile = a.csv // le fichier doit être importé.

class blah
{
 static public function readJobsFromFile($file)
{            
    if (($handle = fopen($file, "r")) === FALSE) 
    {
        echo "readJobsFromFile: Failed to open file [$file]\n";
        die;
    }

    $header=true;
    $index=0;
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
    {
        // ignore header
        if ($header == true)
        {
            $header = false;
            continue;
        }

        if ($data[0] == '' && $data[1] == '' ) //u have oly 2 fields
        {
            echo "readJobsFromFile: No more input entries\n";
            break;                        
        }            


        $a      = trim($data[0]);
        $b   = trim($data[1]);                 





        if (check_if_exists("SELECT count(*) FROM Db_table WHERE a='$a' AND b='$b'") === true)
        {

                $index++;
            continue;    
        }            

        $sql = "INSERT INTO DB_table SET a='$a' , b='$b' ";
        @mysql_query($sql) or die("readJobsFromFile: " . mysql_error());            
        $index++;
    }

    fclose($handle);        
    return $index; //no. of fields in database.
} 
function
check_if_exists($sql)
{
$result = mysql_query($sql) or die("$sql --" . mysql_error());
if (!$result) {
    $message  = 'check_if_exists::Invalid query: ' . mysql_error() . "\n";
    $message .= 'Query: ' . $sql;
    die($message);
}

$row = mysql_fetch_assoc ($result);
$count = $row['count(*)'];
if ($count > 0)
    return true;
return false;
}

$infile=a.csv; 
blah::readJobsFromFile($infile);
}

j'espère que cela t'aides.

2
Naren Karthik

je pense que l’essentiel à retenir de l’analyse de CSV est qu’il suit quelques règles simples:

a) c’est un fichier texte si facile à ouvrir b) chaque ligne est déterminée par une fin de ligne\n donc divisez la chaîne en lignes d’abord c) chaque ligne/ligne contient des colonnes déterminées par une virgule afin de scinder chaque ligne par celle-ci pour obtenir un tableau de colonnes

lisez ce message pour voir de quoi je parle

il est en fait très facile à faire une fois que vous avez compris et que cela devient très utile.

0
PHP Addict