Question

Salut à tous j'ai un problème avec l'ouverture CSV via le code PHP. Mon code PHP est:

<?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>";
?>

Le problème est pas dans le code PHP, le problème est dans .csv. le code PHP doit fonctionner même s'il manque une virgule, quand il affiche les informations de façon normale.

Le fichier .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, 
Était-ce utile?

La solution

<?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>";
?>

Autres conseils

Si vous n'avez pas le contrôle du CSV entrant, vous ne vont pas être en mesure d'utiliser fgetcsv. Comment est-il censé savoir s'il y a un manque ,?

Malheureusement, vous allez devoir écrire votre propre fonction pour gérer cela. Je commencerais par la lecture de chaque ligne dans un tableau. boucle ensuite à travers la ligne et les explodeing par une virgule. Ensuite, vous devrez vérifier chaque valeur et essayer de déterminer si somethings manque dans le tableau résultant.

regard Let sur la ligne problématique dans votre exemple.

Six, Sfamily, Male, 1967, 9876542

Voici ce que nous savons à ce sujet:

  • Il contient une valeur moins alors tout le reste, nous devons donc exécuter des contrôles de cohérence des données là-dessus.
  • Nous savons les première et seconde valeurs vont être des chaînes que ne pas égal « Homme » ou « Femme ».
  • Nous savons la troisième valeur doit toujours être égale soit « Homme » ou « Femme ».
  • Nous savons la quatrième valeur va être un an et devrait toujours être une valeur numérique.
  • Nous savons la cinquième valeur est manquante et il devrait être un code de ville et sera toujours deux lettres de longueur.

Sur la base de cette information, vous devriez être en mesure d'écrire quelques vérifications pour déterminer si l'une de ces valeurs ne correspond pas à ce que vous attendez, et puis le fixer.

Le problème est le plus susceptible de le faire avec des lignes comme:

Six, Sfamily, Male, 1967, 9876542

Si il n'y a pas d'information de la ville. Dans ce cas, vous ne serez jamais « 9876542 » pour apparaître dans la colonne de téléphone, sauf si vous appliquez une certaine logique pour déterminer que ce n'est pas la ville, et pour passer à la colonne suivante. Ce que vous devez faire si, de sorte que vous avez 6 colonnes dans chaque ligne, est qu'au lieu de remettre à zéro $ maximum à chaque fois, vous devez simplement mettre une fois après avoir lu l'en-tête. Affichez ensuite ce nombre de colonnes de chaque ligne que vous lisez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top