我在Mysql中创建了一个包含表名(CSV文件名)和字段名(CSV列名)的数据结构。
现在我正在将数据从csv成功导入到Mysql表中我在脚本中硬编码csv文件名和字段名。如何动态获取因为我有manny csv文件导入到mysql。
<?php
include "db.php";
$filename = "C:\REQ\Status.csv";
if (($handle = fopen($filename, 'r')) !== FALSE)
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
{
print_r($data);
$import="INSERT into status(status) values('$data[1]')";
mysql_query($import) or die(mysql_error());
}
fclose($handle);
?>
答案 0 :(得分:1)
我已经实现了这段代码,它是经过测试的代码。我认为这是非常充分的使用
您遵循一些规则: -
1.您的csv文件根据数据库表名称(例如:db表名是用户,那么csv应该是users.csv)
2.开始输入数据后,你的csv文件的第一行应该是db表字段名称(例如:Id,name等)
3.您可以从以下位置下载数据源类: - http://code.google.com/p/php-csv-parser/ 因为我需要在代码下方:require_once'CSV / DataSource.php';
<?php
ini_set('memory_limit','512M');
$dbhost = "localhost";
$dbname = "excel_import";
$dbuser = "root";
$dbpass = "";
$conn=mysql_connect ($dbhost, $dbuser, $dbpass) or die ("I cannot connect to the database because: " . mysql_error());
mysql_select_db($dbname) or die("Unable to select database because: " . mysql_error());
require_once 'CSV/DataSource.php';
$filename = "users.csv";
$ext = explode(".",$filename);
$path = "uploads/".$filename;
$dbtable = $ext[0];
import_csv($dbtable, $path);
function import_csv($dbtable, $csv_file_name_with_path)
{
$csv = new File_CSV_DataSource;
$csv->load($csv_file_name_with_path);
$csvData = $csv->connect();
$res='';
foreach($csvData as $key)
{
$myKey ='';
$myVal='';
foreach($key as $k=>$v)
{
$myKey .=$k.',';
$myVal .="'".$v."',";
}
$myKey = substr($myKey, 0, -1);
$myVal = substr($myVal, 0, -1);
$query="insert into ".$dbtable." ($myKey)values($myVal)";
$res= mysql_query($query);
}
if($res ==1)
{
echo "record successfully Import.";
}else{
echo "record not successfully Import.";
}
}
答案 1 :(得分:0)
这样的事情:
function integrate($filename)
{
if (($handle = fopen($filename, 'r')) !== FALSE)
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
{
print_r($data);
$import="INSERT into status(status) values('$data[1]')";
mysql_query($import) or die(mysql_error());
}
fclose($handle);
}
$files = scandir('folder/');
foreach($files as $file) {
//pre-checking (if already integrated, if CSV etc..)
integrate($file);
}
答案 2 :(得分:0)
如果您将其作为PHP脚本运行,则可以使用$argv[1]
将文件名作为参数获取。但是,您需要检查该文件是否存在。
答案 3 :(得分:0)
如果文件名和表名匹配,那么无论您在何处输入或检索文件名,都可以在查询中使用相同的值:
$filename = "Status";
$table_name = strtolower( $filename );
$filename = "C:\REQ\{$filename}.csv";
if (($handle = fopen($filename, 'r')) !== FALSE)
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
{
print_r($data);
$import="INSERT into {$table_name}(status) values('$data[1]')";
对于列名,我建议将它们放在CSV文件的第一行并从那里解析它们,例如:
if (($handle = fopen($filename, 'r')) !== FALSE)
$columns = fgets($handle, 1000);
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
{
print_r($data);
$import="INSERT into {$table_name}({$columns}) values('{$data[1]}')";
我还建议考虑为多行INSERT构建单个SQL查询字符串。 E.g。
$values = array();
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
{
print_r($data);
$values[] = "('{$data[1]}')";
...
}
$values = join( ",\n\n", $values );
$insert = "INSERT into {$table_name}({$columns}) values {$values}";