27 votes

Lecture à partir d'un fichier texte délimité par des virgules ou des tabulations

Je dois lire les données d'un fichier qui peuvent être délimitées soit par des virgules soit par des tabulations. Je sais qu'il existe une fonction getcsv mais elle n'accepte qu'un seul délimiteur possible.

Des idées sur la façon de gérer cela ?

Merci.

44voto

MathieuK Points 2888

À partir de PHP 5.3, vous pouvez utiliser str_getcsv() pour lire des lignes individuelles en utilisant des délimiteurs différents.

$someCondition = someConditionToDetermineTabOrComma();

$delimiter = $someCondition ? "," : "\t";

$fp = fopen('mydata.csv', 'r');

while ( !feof($fp) )
{
    $line = fgets($fp, 2048);

    $data = str_getcsv($line, $delimiter);

    doSomethingWithData($data);
}                              

fclose($fp);

12voto

ZZ Coder Points 36990

Vous pouvez spécifier un délimiteur pour fgetcsv(). Voici un exemple de lecture de fichiers délimités par des tabulations,

 while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) {
    ...
 }

6voto

Voici un exemple qui lira les champs CSV de monfichier.txt

$tab = "\t";

$fp = fopen('monfichier.txt', 'r');

while ( !feof($fp) )
{
    $line = fgets($fp, 2048);

    $data_txt = str_getcsv($line, $tab);

    // Obtenir la première ligne de données ici
    print_r($data_txt);
    exit;
}                              

fclose($fp);

2voto

JupiterN Points 113
$cheminFichier = "somefile.txt";
$delimiter = "\t";

$fichier = new \SplFileObject($cheminFichier);
while (!$fichier->eof()) {
    $ligne = $fichier->fgetcsv($delimiter);
    print_r($ligne);
}

1voto

Joe Devine Points 130

Voici la fonction que j'ai ajoutée à ma bibliothèque d'utilitaires pour une utilisation future. Je l'ai dérivée de la réponse de NSSec.

Cette solution vous permet de spécifier si vous voulez utiliser la première ligne comme clés pour le tableau. Je vais probablement ajouter la possibilité de passer un tableau à utiliser pour les clés du paramètre $first_line_keys à un moment donné.

/**
*   Convertit un fichier CSV en un tableau
*   REMARQUE : le fichier n'a pas besoin d'avoir l'extension .csv
*   
*   $file - chemin du fichier à convertir (chaîne)
*   $delimiter - délimiteur de champ (chaîne)
*   $first_line_keys - utiliser la première ligne comme clés du tableau (booléen)
*   $line_length - définir la longueur à récupérer pour chaque ligne (entier)
*/
public static function CSVToArray($file, $delimiter = ',', $first_line_keys = true, $line_length = 2048){

    // fichier inexistant
    if( !file_exists($file) ){
        return false;
    }

    // ouvrir le fichier
    $fp = fopen($file, 'r');

    // ajouter chaque ligne au tableau
    $csv_array = array();
    while( !feof($fp) ){

        // obtenir la ligne actuelle
        $line = fgets($fp, $line_length);

        // ligne en tableau
        $data = str_getcsv($line, $delimiter);

        // incompatibilité du nombre de clés/données
        if( isset($keys) && count($keys) != count($data) ){

            // passer à la ligne suivante
            continue;

        // première ligne, la première ligne doit être des clés
        }else if( $first_line_keys && !isset($keys) ){

            // utiliser les données de la ligne comme clés
            $keys = $data;

        // première ligne utilisée comme clés
        }else if($first_line_keys){

            // ajouter en tant que tableau associatif
            $csv_array[] = array_combine($keys, $data);

        // première ligne non utilisée comme clés
        }else{

            // ajouter en tant que tableau numérique
            $csv_array[] = $data;

        }

    }

    // fermer le fichier
    fclose($fp);

    // rien trouvé
    if(!$csv_array){
        return array();
    }

    // retourner le tableau CSV
    return $csv_array;

} // CSVToArray()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X