Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 以奇怪的格式处理csv文件_Php_Mysql_Csv_Phpmyadmin - Fatal编程技术网

Php 以奇怪的格式处理csv文件

Php 以奇怪的格式处理csv文件,php,mysql,csv,phpmyadmin,Php,Mysql,Csv,Phpmyadmin,我正在使用phpmyadmin的“加载数据”功能,通过上传csv文件来更新(或更新)我数据库中的一些数据。csv文件有50列和200k行。这种格式非常有效,速度非常快: 100;101;102;103;104;.... Alfred;Mueller;Exampplestreet 1;12121;Chicago;.... John;Wiliams;Exampplestreet 2;12345;Dallas;.... Mandy;Peterson;Exampplestreet 3;44554;LA;

我正在使用phpmyadmin的“加载数据”功能,通过上传csv文件来更新(或更新)我数据库中的一些数据。csv文件有50列和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行(以
分隔),然后将每个字段
分解()
读取为
#
,如果有两个字段,则将其添加到输出数组(
$data

输出将类似于

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);
}

这显然比直接加载要慢(您需要在上面添加数据库调用)。

感谢Nigel,我将以这种方式进行测试。问题是要运行20万条线路需要多长时间:(不知道需要多长时间,这取决于您的数据库和硬件。您也应该为SQL使用准备好的语句。
while ( !feof($handle) )    {
    $data = fgetcsv( $handle, null, ";" );
    foreach ( $data as &$value ) {
        $value = substr($value, 4);
    }

    print_r($data);
}