我正在通过phpmyadmin使用“ LOAD DATA”功能,通过上传一个csv文件来更新(或续订)数据库中的某些数据。 csv文件有50个cols和200k行。此格式效果很好,并且使用此格式非常快:
100;101;102;103;104;....
Alfred;Mueller;Exampplestreet 1;12121;Chicago;....
John;Wiliams;Exampplestreet 2;12345;Dallas;....
Mandy;Peterson;Exampplestreet 3;44554;LA;....
...
现在,我有机会通过接收数据提供者的csv数据文件来完全自动化此过程。但是数据提供者提供了这样的csv文件:
100#Alfred;101#Mueller;102#Exampplestreet 1;103#12121;104#Chicago;....
100#John;101#Wiliams;102#Exampplestreet 2;103#12345;104#Dallas;....
100#Mandy;101#Peterson;102#Exampplestreet 3;103#44554;104#LA;....
有没有机会处理提供者的格式?我从来没有使用过这样的csv文件格式?
似乎您需要从每个值中提取字段类型,不确定是否相关,但是如果您需要的话,我已将其转换为字段的键(无论如何,差异并不大) )。
基本上将每行读为CSV行(由;
分隔),然后对于每个字段explode()
,将其乘以#
,如果有2个字段,则将其添加到输出数组($data
)。 。
$fileName = "data.csv";
$handle = fopen ( $fileName, "r" );
while ( !feof($handle) ) {
$fileData = fgetcsv( $handle, null, ";" );
$data = [];
foreach ( $fileData as $value ) {
$values = explode("#", $value, 2);
if ( count($values) == 2 ) {
$data[ $values[0] ] = $values[1];
}
}
print_r($data);
}
fclose($handle);
输出将类似于...
Array
(
[100] => Alfred
[101] => Mueller
[102] => Exampplestreet 1
[103] => 12121
[104] => Chicago
)
如果不需要字段类型,并且它始终是三个字符后跟一个#
,则可以通过更新读取数组的值(使用substr()
来始终删除前四个字符)来使其更短。 。
while ( !feof($handle) ) {
$data = fgetcsv( $handle, null, ";" );
foreach ( $data as &$value ) {
$value = substr($value, 4);
}
print_r($data);
}
这显然比直接加载它慢(并且您需要在上面添加数据库调用)。