Importar datos CSV usando PHP / MySQL

Tengo un pequeño problema tratando de importar datos de un archivo CSV y tengo un par de preguntas que aún no he podido resolver.

En primer lugar, aquí está mi código para ayudar a poner las cosas en perspectiva (lo arregló un poco, eliminando la conexión CSS y DB):

 
<?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 "

" . "File ". $_FILES['filename']['name'] ." uploaded successfully." . "

"; echo "

Displaying contents:

"; 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
\n"; print "
"; print "File name to import:
\n"; print "
\n"; print "
"; } ?>

Básicamente es una adaptación de un ejemplo que he encontrado después de muchos bashs en varios métodos.

Mi CSV tiene dos columnas de datos, la primera es texto y la segunda es números enteros. La tabla en la base de datos también tiene dos columnas, la primera llamada “texto” y la segunda “número”

Entonces las preguntas que tengo son:

  1. el texto que se está cargando se muestra como 0 en todos los campos y no estoy seguro de por qué
  2. Sigo leyendo sobre los datos que terminan encerrados en “”, si eso sucede, ¿cómo lo ordenaría?
  3. ¿cómo puedo ignorar las primeras líneas X del CSV para encabezados, etc.?
  4. ¿El formato de datos ha cambiado a lo largo de este proceso o está listo para usarlo en un gráfico? por ejemplo, ¿un decimal permanecería un decimal una vez colocado en la base de datos?

Creo que eso cubre todo, ¡gracias de antemano por cualquier ayuda!

EDITAR:

Acabo de hacer una prueba de 10.000 registros cargados y obtuve el error:

“Error fatal: se excedió el tiempo máximo de ejecución de 30 segundos”

¿Alguna idea?

Respondí una pregunta prácticamente idéntica el otro día: guardar archivos CSV en la base de datos mysql

MySQL tiene una característica LOAD DATA INFILE , que le permite importar un archivo CSV directamente en una sola consulta SQL, sin necesidad de que sea procesado en un bucle a través de su progtwig PHP.

Ejemplo simple:

 query($query); ?> 

Es tan simple como eso.

Sin bucles, sin problemas. Y mucho más rápido que analizarlo en PHP.

Página de manual de MySQL aquí: http://dev.mysql.com/doc/refman/5.1/en/load-data.html

Espero que ayude

 $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; } 
 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); 

letsay $ infile = a.csv // el archivo necesita ser importado.

 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); } 

espero que esto ayude.

Creo que las principales cosas para recordar sobre el análisis de csv es que sigue algunas reglas simples:

a) es un archivo de texto tan fácil de abrir b) cada fila está determinada por un final de línea \ n así que divida la cadena en líneas primero c) cada fila / línea tiene columnas determinadas por una coma, así que divida cada línea para obtener una matriz de columnas

leer esta publicación para ver de lo que estoy hablando

en realidad es muy fácil de hacer una vez que lo dominas y se vuelve muy útil.

Conexión de base de datos:

  try { $conn = mysqli_connect($servername, $username, $password, $db); //echo "Connected successfully"; } catch (exception $e) { echo "Connection failed: " . $e->getMessage(); } 

Código para leer el archivo CSV y subirlo a la tabla en la base de datos.

  $file = fopen($filename, "r"); while (($getData = fgetcsv($file, 10000, ",")) !== FALSE) { $sql = "INSERT into db_table values ('','" . $getData[1] . "','" . $getData[2] . "','" . $getData[3] . "','" . $getData[4] . "','" . $getData[5] . "','" . $getData[6] . "')"; $result = mysqli_query($conn, $sql); if (!isset($result)) { echo ""; } else { echo ""; } } fclose($file);