.csv文件和错过的逗号的问题

时间:2011-01-28 16:59:37

标签: php csv fgetcsv

大家好我在使用PHP代码打开CSV时遇到问题。我的PHP代码是:

<?php
header("Content-Type: text/html; charset=windows-1251");

echo "<html>
<head>
    <title></title>
</head>
<body>
";

$file = "import.csv";

if(file_exists($file)) {
    if (($fopen = fopen($file, "r")) !== FALSE) {
        echo "<table>\n";
        while (($data = fgetcsv($fopen, 1024, ",")) !== FALSE) {
            $max = count($data);
            $num++;
            echo "<tr>\n<td>".$num."</td>\n";
            for ($i=0;$i<$max;$i++) {
                echo "<td>".$data[$i]."</td>\n";
            }
            echo "</tr>\n";
        }
        echo "</table>";
        fclose($fopen);
    }
}
else {
    echo "File doesn't exists!";
}

echo "
</body>
</html>";
?>

问题不在PHP代码中,问题出在.csv文件中。当代码以正常方式显示信息时,即使缺少逗号,PHP代码也必须正常工作。

.csv文件:

First name,Family,Sex,Date of birth,City,Phone number
One, Ofamily, Male, 1975, LA,13-25-16
Two, Tfamily, Male, 1955, LV, 555-14345
Three, Thfamily, Male, 1958, NY, 15689
Four, Ffamily, Female, 1974, SF, 5897912
Five, Fifamily, Male, 1991, LA, 123456789
Six, Sfamily, Male, 1967, 9876542
Seven, Sefamily, Female,, SF, 

3 个答案:

答案 0 :(得分:0)

如果您无法控制传入的CSV,则无法使用fgetcsv。怎么知道是否缺少,

不幸的是,你将不得不编写自己的函数来处理这个问题。我首先将每一行读入一个数组。然后循环遍历该行并用逗号explode对它们进行循环。然后,您将必须检查每个值并尝试确定结果数组中是否缺少某些东西。

让我们看看你的例子中有问题的一行。

Six, Sfamily, Male, 1967, 9876542

以下是我们对它的了解:

  • 它包含的值少于其余所有值,因此我们应该对它进行一些数据一致性检查。
  • 我们知道第一个和第二个值将是等于“男性”或“女性”的字符串。
  • 我们知道第三个值应始终等于“男性”或“女性”。
  • 我们知道第四个值将是一年,并且应该始终是一个数值。
  • 我们知道缺少第五个值,它应该是一个城市代码,长度总是两个字母。

根据这些信息,您应该能够编写一些检查来确定其中一个值是否与您期望的值不相符,然后进行修复。

答案 1 :(得分:0)

这个问题很可能与以下几行有关:

Six, Sfamily, Male, 1967, 9876542

没有城市信息的地方。在这种情况下,除非您应用某些逻辑来确定这不是城市,否则您永远不会将“9876542”显示在电话列中,并跳到下一列。你应该做什么,这样你每行有6列,而不是每次都重置$ max,你应该在阅读标题后设置一次。然后显示您读取的每一行的列数。

答案 2 :(得分:0)

<?php
header("Content-Type: text/html; charset=windows-1251");

echo "<html>
<head>
    <title></title>
</head>
<body>
";

$file = "import.csv";

if(file_exists($file)) {
    if (($fopen = fopen($file, "r")) !== FALSE) {
        echo "<table>\n";
        while (($data = fgetcsv($fopen, 1024, ",")) !== FALSE) {
            $num++;
            echo "<tr>\n<td>".$num."</td>\n";
            foreach($data as $k => $v) {
                switch ($k) {
                    case 0 : // first name
                    case 1 : // family
                    case 2 : // sex
                    case 4 : // city
                        if (is_numeric($v)) {
                            array_splice($data,$k,0,'');
                        }
                        break;
                    case 3 : // date of birth
                    case 5 : // phone number
                        if (!is_numeric($v)) {
                            array_splice($data,$k,0,'');
                        }
                        break;
                }
            }
            foreach($data as $v) {
                echo "<td>".$v."</td>\n";
            }
            echo "</tr>\n";
        }
        echo "</table>";
        fclose($fopen);
    }
}
else {
    echo "File doesn't exists!";
}

echo "
</body>
</html>";
?>