处理具有奇怪格式的csv文件

问题描述 投票:0回答:1

我正在通过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文件格式?

php mysql csv phpmyadmin
1个回答
0
投票

似乎您需要从每个值中提取字段类型,不确定是否相关,但是如果您需要的话,我已将其转换为字段的键(无论如何,差异并不大) )。

基本上将每行读为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);
}

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

© www.soinside.com 2019 - 2024. All rights reserved.