Question

J'essaie de lire les données d'un fichier.csv pour les exporter sous forme de texte sur une page Web.

C’est la première fois que je fais ça et j’ai eu un vilain petit problème.

Mon fichier .csv (qui est ouvert par défaut par Excel), a plusieurs lignes et je lis le tout en une seule chaîne.

comme ceci:

$contents = file_get_contents("files/data.csv");

Dans cet exemple de fichier que j'ai créé, il y a 2 lignes.

  

Paul Blueberryroad   85 nous lampe de poche, sac 20 novembre,   2008, 16h39

     

Blueberryroad Hellen   85 lentilles usb13mm, Lampe de poche, Sac, ExtraBatteries November   20 juillet 2008 à 16:41:32

Mais la chaîne lue par PHP est la suivante:

Paul; Blueberryroad 85; nous; lampe de poche, sac; le 20 novembre 2008, 16h39Hellen; Blueberryroad 85; nous; objectif13mm, lampe de poche, sac, extra-piles; le 20 novembre 2008, 16:41:32

Je partage ceci avec:

list($name[], $street[], $country[], $accessories[], $orderdate[]) = split(";",$contents);

Ce que je veux, c'est que $ name [] contienne " Paul " et " Hellen " comme son contenu. Et les autres tableaux recevront les valeurs de leurs colonnes respectives.

Au lieu de cela, je ne reçois que Paul et le contenu de $ orderdate [] est

  

20 novembre 2008 à 16h39Hellen

Toutes les lignes sont donc concaténées. Est ce que quelqu'un peut me montrer comment je peux réaliser ce dont j'ai besoin?

EDIT: solution trouvée, il ne reste qu’une chose à faire:

Je l'ai résolu maintenant en utilisant ce morceau de code:

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

Pour une raison quelconque, bien que mon fichier CSV ne comporte que 2 lignes, il renvoie 2 tableaux et 1 booléen. Les 2 premiers sont mes tableaux de données et le booléen est 0.

Était-ce utile?

La solution

Vous feriez mieux d'utiliser fgetcsv () , qui connaît la structure de fichier CSV et propose des options pour gérer les fichiers CSV. Vous pouvez également utiliser str_getcsv () sur le contenu de le fichier à la place.

Autres conseils

La fonction file () lit un fichier dans un tableau, chaque ligne est une entrée du tableau.

Vous pouvez donc faire quelque chose comme:

$rows = array();
$name = array();
$street = array();
$country = array();

$rows = file("file.csv");
foreach($rows as $r) {
    $data = explode(";", $r);
    $name[] = $data[0];
    $street[] = $data[1];
    $country[] = $data[2];
}

Je l'ai résolu maintenant en utilisant ce morceau de code:

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

Pour une raison quelconque, bien que mon fichier CSV ne comporte que 2 lignes, il renvoie 2 tableaux et 1 booléen. Les 2 premiers sont mes tableaux de données et le booléen est 0.

La remarque concernant fgetcsv est correcte.

Je répondrai quand même à votre question, à des fins éducatives. Tout d’abord, je ne comprends pas la différence entre vos données (avec des comas) et la "chaîne lue par PHP". (Il remplace certains espaces par des points-virgules, mais pas tous?). PS: j’ai regardé le code source de votre message, cela ressemble à un étrange mélange de TSV (onglets) et CSV (coma).

En outre, si vous voulez utiliser cette méthode, vous devez d'abord diviser le fichier en lignes, puis les lignes en champs.

La meilleure façon de procéder est bien entendu fgetcsv (), comme indiqué.

$f = fopen ('test.csv', 'r');
while (false !== $data = fgetcsv($f, 0, ';'))
    $arr[] = $data;
fclose($f);

Mais si vous avez le contenu dans une variable et que vous souhaitez le scinder, et que str_getcsv n'est pas disponible, vous pouvez utiliser ceci:

function str_split_csv($text, $seperator = ';') {
    $regex = '#' . preg_quote($seperator) . '|\v#';
    preg_match('|^.*$|m', $text, $firstline);
    $chunks = substr_count($firstline[0], $seperator) + 1;
    $split = array_chunk(preg_split($regex, $text), $chunks);
    $c = count($split) - 1;
    if (isset($split[$c]) && ((count($split[$c]) < $chunks) || (($chunks == 1) && ($split[$c][0] == ''))))
        unset($split[$c]);
    return $split;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top