0

大家好,我在通过 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, 
4

3 回答 3

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>";
?>
于 2011-01-28T17:24:15.520 回答
0

如果您无法控制传入的 CSV,您将无法使用fgetcsv. 它应该如何知道是否有缺失,

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

让我们看看您的示例中存在问题的行。

Six, Sfamily, Male, 1967, 9876542

以下是我们对它的了解:

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

根据该信息,您应该能够编写一些检查以确定其中一个值是否不等于您的预期,然后修复它。

于 2011-01-28T17:12:16.990 回答
0

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

Six, Sfamily, Male, 1967, 9876542

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

于 2011-01-28T17:12:48.267 回答