PHP未正确处理CSV文件中的第一行

时间:2014-07-31 02:31:03

标签: php html csv

比较两个CSV文件,在相同标识符的情况下,我想在某个公式进行计算。 总而言之,我无法获得第一行结果。

我的代码(test.php)

<html>
<head>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD XTHML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <link rel="stylesheet" type="text/css" href="it_test_check_uesr_list_table.css" /></head>
<body>
<?php 
    $data = fopen("rate.csv", "r");
    /*  rate.csv

        code,codename,data,.......
        3668,A, 3325,+50(+1.53%),410518,A
        3765,B, 606,+1(+0.17%),698118,B
        7832,C, 2557,+10(+0.39%),567654,C
        6460,D, 2048,-11(-0.53%),545238,D
    */
    $baserate = fopen("baserate.csv", "r");
    /*  baserate.csv

        code,data
        7832,2312
        3765,734
        3668,3025
        6460,2682
    */
    if($baserate){
        while ($baserate_line = fgets($baserate)) 
        {
            list($temp_code,$temp_data) = explode(",", rtrim($baserate_line));
            $base_rate[] = (object)array('code' => $temp_code,
            'data' =>  mb_convert_encoding($temp_data, "UTF-8", "auto"));
        }
    }
    if($data){
        while ($line = fgets($data)) 
        {
            list($temp_code,$temp_codename,$temp_data,$temp_comparison_previous_day,$temp_market_capitalization,$temp_market) = explode(",", rtrim($line));
            for($i = 0; $i< count($base_rate); $i++) 
            {
                if($temp_code == $base_rate[$i]->code)
                {   
                    //What I want (temp_data_index)
                    $temp_data_index = number_format($temp_data / $base_rate[$i]->data * 100,2); 
                }
            }
            $company[] = (object)array('code' => $temp_code,
            'codename' =>  mb_convert_encoding($temp_codename, "UTF-8", "auto"),
            'data' => mb_convert_encoding($temp_data, "UTF-8", "auto"),
            'comparison_previous_day' => mb_convert_encoding($temp_comparison_previous_day, "UTF-8", "auto"),
            'market_capitalization' => mb_convert_encoding($temp_market_capitalization, "UTF-8", "auto"),
            'market' => mb_convert_encoding($temp_market, "UTF-8", "auto"),
            'data_index' => mb_convert_encoding($temp_data_index, "UTF-8", "auto"));
        }
    }
    // A(The first row ) Always don't work
    for($i = 0; $i< count($company); $i++) 
    {
        echo $company[$i]->codename." - ".$company[$i]->data_index."<br>";
    }
    ?>
</body>
</html>

结果是

A - 
B - 82.56
C - 82.56
D - 76.36

&#39; A&#39;(csv文件中的第一行)不适用于循环。(有相同的代码,我检查了var_dump) 我的问题是什么?

1 个答案:

答案 0 :(得分:1)

好的,我会采取摆动,但首先,让我们清理你的代码。它很难遵循,有一些可怕的编程实践,并且在这个例子中有很多不相关的东西。所以这就是我所做的:

  • 删除html,在此上下文中没有理由
  • php知道如何解析csv。 <爆炸比爆炸更安全
  • 调用变量&#34;数据&#34;应该是犯罪。它是指向费率文件的文件描述符。如果它被称为数据则很难记住。然后你还可以在费率文件数据中调用一列,在baserate文件中调用一列数据 - 这样可以使事情变得更加清晰。我重新命名了第一个,而离开了其他人,因为我不知道它代表什么,但是神圣的狡诈蝙蝠侠。
  • 将相关的事物组合在一起。打开文件,加载数据。然后打开下一个文件并加载它的数据。然后过程。同时做这一切使得很难跟进一个例子
  • 除非你真的需要,否则不要使用数组作为对象。它使您的代码难以阅读。
  • 不要担心编码的例子。确定,在您的生产代码中有它,但在这个示例中,它再次使您难以遵循您的代码 - 它与您的问题无关
  • 而不是每次循环遍历所有基础,找到你想要的那个,用你正在寻找的东西索引它们的数组
  • 至少有一个csv文件(rate.csv)有空格作为某些列的开头(&#34;数据&#34;列),所以为了安全起见,你应该修剪每个字段,而不仅仅是每一行< / LI>

// load rates
$fd_rates = fopen("rate.csv", "r");
if (!$fd_rates) die("Unable to open rate.csv");
$rates = array();
while (($rate_row = fgetcsv($fd_rates)) !== FALSE) {
    // key by code, turn into associative array
    $rates[ trim($rate_row[0]) ] = array(
        'code' => trim($rate_row[0]),
        'codename' => trim($rate_row[1]),
        'data' => trim($rate_row[2]),
        'comparison_previous_day' => trim($rate_row[3]),
        'market_capitalization' => trim($rate_row[4]),
        'market' => trim($rate_row[5]),
    );
}
fclose($fd_rates);
/*  rate.csv / $rates

    code,codename,data,....... // this line not in file
    3668,A, 3325,+50(+1.53%),410518,A
    3765,B, 606,+1(+0.17%),698118,B
    7832,C, 2557,+10(+0.39%),567654,C
    6460,D, 2048,-11(-0.53%),545238,D
*/

// load baserates
$fd_baserates = fopen("baserate.csv", "r");
if (!$fd_baserates) die("Unable to open baserate.csv");
$baserates = array();
while (($baserate_row = fgetcsv($fd_baserates)) !== FALSE) {
    // code => data
    $baserates[ trim($baserate_row[0]) ] = trim($baserate_row[1]);
}
fclose($fd_baserates);
/*  baserate.csv

    code,data // this line not in file
    7832,2312
    3765,734
    3668,3025
    6460,2682
*/

// calculate
foreach ($rates as $code => $rate) {
    if (isset($baserates[$code])) {
        $rates[$code]['data_index'] = number_format($rate['data'] / $baserates[$code] * 100, 2);
    } else {
        $rates[$code]['data_index'] = 'no baserate found';
    }
}

// display
foreach ($rates as $code => $rate) {
    echo "{$rate['codename']} - {$rate['data_index']}\n";
}

然后我只是运行代码......它的工作原理。我不打算在您的代码中找到特定的错误,但老实说,在我的意见中,这是由于糟糕的编程习惯。为变量命名。简化。祝你好运!

$ php index.php 
A - 109.92
B - 82.56
C - 110.60
D - 76.36

$ php -v
PHP 5.5.9-1ubuntu4.4 (cli) (built: Sep  4 2014 06:56:34) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies