比索
// $numberOption = the number of fields in TableA.
// $csvHeaders = a single dimention array with all the names of the fields in a CSV file.
// $tableHeaders = a single dimention array with all the names of the fields in TableA.
for ($a=0; $a < $numberOption; $a++) {
if ($a == 0) {
$toVars .= "@var$a";
$setCols .= $tableHeaders[$a] . " = @var" . $csvHeaders[$a];
} else {
$toVars .= ", @var$a";
$setCols .= ", " . $tableHeaders[$a] . " = @var" . $csvHeaders[$a];
}
}
$sql = "LOAD DATA LOCAL INFILE '".addslashes($current_file)."' REPLACE INTO TABLE $current_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '" . '"' . "' ESCAPED BY " . "'\\\\'" . " LINES TERMINATED BY '\n' IGNORE 1 LINES ($toVars) SET $setCols";
$ sql的返回值
"LOAD DATA LOCAL INFILE '\/var\/www\/html\/test_lms\/include\/files\/1349237011-2fb46cd0c360464ebf471755cc9580de-AUTO_INSURANCE.csv' REPLACE INTO TABLE auto FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\\\\' LINES TERMINATED BY '\n' IGNORE 1 LINES (@var0, @var1, @var2, @var3, @var4, @var5, @var6, @var7, @var8, @var9, @var10, @var11, @var12, @var13, @var14, @var15, @var16, @var17, @var18, @var19, @var20, @var21, @var22, @var23, @var24, @var25, @var26, @var27, @var28, @var29) SET callcenter = @var, agent = @varEMPTY, generation_date = @varEMPTY, first_name = @varEMPTY, last_name = @varEMPTY, email = @var3, phone = @var4, address = @var5, city = @var6, state = @var7, dob = @varEMPTY, gender = @varEMPTY, marital_status = @varEMPTY, rented = @varEMPTY, year = @varEMPTY, make = @varEMPTY, model = @varEMPTY, trim = @varEMPTY, vin = @varEMPTY, primary_use = @varEMPTY, miles_oneway = @varEMPTY, mileage = @varEMPTY, license_num = @varEMPTY, license_state = @varEMPTY, education = @varEMPTY, job_title = @varEMPTY, vendors = @var9, license_status = @varEMPTY, zip = @var8, dupe = @varEMPTY
显然在php行$setCols .= $tableHeaders[$a] . " = @var" . $csvHeaders[$a];
中,它正在初始化$setCols
,其字段名称来自tableA
,然后是等号,那么这个东西@var
(其中我猜是一个mysql变量?),然后是一个csv字段名。但结果显示一个数字附加到@var
符号而不是csv字段名称!有些@var
附加了EMPTY
,这意味着$csvHeaders
数组中没有要使用的字段名称,因此返回了EMPTY
。
无论如何,它有效。我能够加载一个csv文件,实际上很好。但我不明白SET
如何与@var#
而不是@varCSVNAME
。另一个问题是为什么要使用@var
? IGNORE LINES 1 (table field names) SET (csv header names)
不能正常工作吗?为什么是@var
?
答案 0 :(得分:1)
LOAD DATA INFILE
声明中使用的格式为
LOAD DATA LOCAL INFILE 'file.txt'
REPLACE INTO TABLE t1
...
(@var0, @var1, ...)
SET column0 = @var0,
SET column1 = @var1,
...
;
此处@var0
,@var1
等是mysql用户变量,column0
,column1
等是mysql表列。 csv文件中的字段将按照csv文件中字段的顺序读入给定的mysql用户变量@var0, @var1, ...
。
我认为没有任何语法允许您将csv头字段名称映射到表列。因此,您将无法使用IGNORE LINES 1 (table field names) SET (csv header names)
。
您的脚本使用$numberOption
创建了许多用户变量,csv文件中的字段将被读入该变量。 $csvHeaders
存储CSV字段相对于相应表列的位置。因此,$tableHeaders[6] = 'email';
和$csvHeaders[6] = 3;
因为csv文件的3rd
字段是email
字段。在LOAD DAT INFILE
语句中,csv文件中的第三个字段将被读入用户变量@var3
,然后SET email = @var3
将使用此变量设置电子邮件列的值。由于没有任何内容被读入@varEMPTY
,因此使用它们设置的列将不会从文件中获取任何数据。同样,读取到@var29
等变量的数据将被忽略。
如果csv文件中的字段为set
;,则可以使用LOAD DATA ... (COL3, COL1, @dummy, COL2, @dummy);
。如果表中的列和csv文件中的字段的数量和顺序不同,则可以使用它。
如果表格中的列和csv文件中的字段在数量和顺序上匹配,那么col3, col1, notInTable, col2, notInTable
就足够了。
如果表格中的列和csv文件中的字段数量匹配但顺序不同,则LOAD DATA ... INTO TABLE t1;
。
答案 1 :(得分:0)
@
符号仅用于PHP中的错误抑制。 What is the use of the @ symbol in PHP?
var
仅在删除类中的变量时使用。
在PHP中声明变量时,您不必事先声明变量(尽管如果您习惯使用其他语言,这是一种很好的做法)。但是,您必须使用前缀$
表示它是变量,例如:$x = 0;
通过mysql使用DATA LOCAL INFILE
,你可以传递“虚拟”参数,以确保它们被设置,即使它们不存在。
使用此行:$setCols .= $tableHeaders[$a] . " = @var" . $csvHeaders[$a];
对我来说似乎有点奇怪,因为@var
将被视为var
的常量,其中@
会抑制常量不会出现的错误退出。
然后连接字符串的其余部分(在您的情况下为$tableHeaders[$a]."= ".$csvHeaders[$a];
)。