所以我试图让它可以通过导入CSV文件来更新MySQL数据库,唯一的问题是我看到我的一些数据有逗号,这导致数据被导入到错误的表中。这是我现有的导入代码。
if ($_FILES[csv][size] > 0) {
//get the csv file
$file = $_FILES[csv][tmp_name];
$handle = fopen($file,"r");
//loop through the csv file and insert into database
do {
if ($data[0]) {
mysql_query("INSERT INTO songdb (artist, title) VALUES
(
'".addslashes($data[0])."',
'".addslashes($data[1])."'
)
") or die (mysql_error());
}
} while ($data = fgetcsv($handle,1000,",","'"));
//
//redirect
header('Location: import.php?success=1'); die;
}
有没有办法可以将其设置为忽略CSV文件中的逗号,引号和撇号?
我还想让它设置为忽略csv中的第一行,看看它是如何只是列信息。如果可能的话。
**编辑** 例如,如果CSV包含诸如“姓氏,名字”或“用户数据”之类的数据,则这些数据实际上只是实际存在的数据的示例。每个月都会导入数据,我们刚刚注意到了这个问题。
示例数据:
第1栏,第2栏 项目1,描述
第2项,说明
项目,3,描述
项目,4,描述
“第5项”,说明
“项目,6”,描述
以上是所请求的样本数据。
答案 0 :(得分:1)
您可能希望使用MySQL的内置LOAD DATA INFILE
语句,它不仅可以更快地工作,还可以让您使用FIELDS OPTIONALLY ENCLOSED BY '"'
子句来处理这类文件。
所以你的查询会是这样的:
mysql_query(<<<SQL
LOAD DATA LOCAL INFILE '{$_FILES['csv']['tmp_name']}'
INTO TABLE songdb
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\\n'
IGNORE LINES 1 (artist, title)
SQL
) or die(mysql_error());
答案 1 :(得分:0)
如果您的数据是脏的,处理此问题的最简单方法是手动清理它,并使用剥离坏字符和/或转义输入数据的数据输入表单,或者告诉正在生成此数据的用户数据停止在字段中放入逗号。
由于在用于生成此数据的任何内容中缺少转义输入,因此您的示例具有不一致的列数和不一致的字段。
那就是说,你可以做一些高级逻辑来重复使用Item之后但在空格或数字之前的任何逗号,使用正则表达式,但这有点荒谬,根据行数,它可能更容易清理在导入之前手动完成。
在跳过标题行方面,您可以这样做:
if ($_FILES[csv][size] > 0) {
//get the csv file
$file = $_FILES[csv][tmp_name];
$handle = fopen($file,"r");
$firstRow = false;
//loop through the csv file and insert into database
do {
if ($data[0]) {
// skip header row
if($firstRow) {
$firstRow=false;
continue;
}
mysql_query("INSERT INTO songdb (artist, title) VALUES
(
'".addslashes($data[0])."',
'".addslashes($data[1])."'
)
") or die (mysql_error());
}
} while ($data = fgetcsv($handle,1000,",","'"));
//
//redirect
header('Location: import.php?success=1'); die;
}
哦,我刚看了你的评论,5gb。哇。手动清理不是一种选择。您需要查看数据被搞砸的可能方式的范围,并真正评估您需要使用什么逻辑来捕获正确的列。
您的示例上方是代表性示例,还是其他没有附件的字段可以使用逗号?
答案 2 :(得分:0)
试试这个,这对我来说很好。
ini_set('auto_detect_line_endings',TRUE);
$csv_data=array();
$file_handle = fopen($_FILES['file_name']['tmp_name'], 'r');
while(($data = fgetcsv($file_handle) ) !== FALSE){
$update_data= array('first'=>$data['0'],
'second'=>$data['1'],
'third'=>$data['2'],
'fourth'=>$data['34']);
// save this array in your database
}