Pages

Wednesday, August 8, 2012

csv file to mysql table

Here is a function that accepts the path to a CSV file, and inserts all records to the given MySQL table, paying attention to the column names:

<?php
function csv_file_to_mysql_table($source_file, $target_table, $max_line_length=10000) {
    if ((
$handle = fopen("$source_file", "r")) !== FALSE) {
       
$columns = fgetcsv($handle, $max_line_length, ",");
        foreach (
$columns as &$column) {
           
$column = str_replace(".","",$column);
        }
       
$insert_query_prefix = "INSERT INTO $target_table (".join(",",$columns).")\nVALUES";
        while ((
$data = fgetcsv($handle, $max_line_length, ",")) !== FALSE) {
            while (
count($data)<count($columns))
               
array_push($data, NULL);
           
$query = "$insert_query_prefix (".join(",",quote_all_array($data)).");";
           
mysql_query($query);
        }
       
fclose($handle);
    }
}

function
quote_all_array($values) {
    foreach (
$values as $key=>$value)
        if (
is_array($value))
           
$values[$key] = quote_all_array($value);
        else
           
$values[$key] = quote_all($value);
    return
$values;
}

function
quote_all($value) {
    if (
is_null($value))
        return
"NULL";

   
$value = "'" . mysql_real_escape_string($value) . "'";
    return
$value;
}
?>

This assumes that the columns in the table have exactly the same name as the columns in the CSV file, except that the dots (".") are removed. This is because MySQL column names cannot contain dots.

No comments:

Post a Comment