【问题标题】:Dealing with a csv file in a strange format处理奇怪格式的csv文件
【发布时间】:2020-07-06 23:42:43
【问题描述】:

我正在使用 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 文件?

【问题讨论】:

    标签: php mysql csv phpmyadmin


    【解决方案1】:

    看起来您需要从每个值中提取字段类型,不确定这是否相关,但我已将其转换为字段的键,以备不时之需(这不是很大的区别无论如何)。

    基本上将每一行读取为 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() 始终删除前 4 个字符..

    while ( !feof($handle) )    {
        $data = fgetcsv( $handle, null, ";" );
        foreach ( $data as &$value ) {
            $value = substr($value, 4);
        }
    
        print_r($data);
    }
    

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

    【讨论】:

    • 谢谢 Nigel,我会这样测试它。问题是运行 200.000 行需要多长时间。 :(
    • 不知道需要多长时间,这取决于您的数据库和硬件。你也应该为你的 SQL 使用准备好的语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2022-08-11
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多