2008-11-22 6 views
3

J'essaie de lire les données d'un fichier.csv pour le sortir sur une page Web en tant que texte.problème avec PHP lecture de fichiers CSV

C'est la première fois que je fais cela et j'ai rencontré un petit problème.

Mon fichier .csv (qui est ouvert par Excel par défaut), a plusieurs lignes et j'ai lu le tout comme une longue chaîne.

comme ceci:

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

Dans ce fichier exemple que j'ai fait, il y a 2 lignes.

Paul Blueberryroad 85 nous Lampe de poche, sac 20 Novembre, 2008, 16:39

Hellen Blueberryroad 85 nous lens13mm, lampe de poche, sac, ExtraBatteries Novembre 20, 2008, 16:41: 32

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

Paul, Blueberryroad 85, nous, lampe de poche, sac, 20 Novembre 2008, 04:39 pmHell en, Blueberryroad 85, nous, lens13mm, lampe de poche, sac ExtraBatteries,, 20 Novembre 2008, 16:41:32

Je vais partager cela avec:

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

Ce que je veux pour le nom de $ [] pour contenir "Paul" et "Hellen" comme contenu. Et les autres tableaux pour recevoir les valeurs de leurs colonnes respectives.

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

20 Novembre 2008, 04:39 pmHellen

Donc, toutes les lignes sont concaténés. Quelqu'un peut-il me montrer comment je peux réaliser ce dont j'ai besoin?

EDIT: solution trouvée, juste une chose werid restant:

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, allthough mon seul fichier CSV a 2 rows, retourne 2 tableaux et 1 booléen. Les 2 premiers sont mes tableaux de données et le booléen est 0.

+0

Pourquoi vous n'utilisez pas fgetcsv? (http://php.net/fgetcsv) –

+0

ne l'a pas connu excisted jusqu'à ce que mentionné ici – Vordreller

Répondre

11

Vous feriez mieux d'utiliser fgetcsv() qui est au courant de la structure du fichier CSV et a désigné des options pour le traitement des fichiers CSV. Alternativement, vous pouvez utiliser str_getcsv() sur le contenu du fichier à la place.

1

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

Ainsi, vous pouvez 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]; 
} 
0

La remarque à propos de fgetcsv est correcte.

Je répondrai toujours à votre question, à des fins éducatives. D'abord, je ne comprends pas la différence entre vos données (avec comas) et la "chaîne lue par PHP" (elle remplace certains espaces par des points-virgules, mais pas tous?). PS .: J'ai regardé le code source de votre message, il ressemble à un mélange étrange de TSV (onglets) et CSV (coma). De plus, si vous voulez aller de cette façon, vous devez d'abord diviser le fichier en lignes, puis les lignes dans les champs.

+0

"(il substitue quelques espaces avec le point-virgule, mais pas tous?)" ainsi semblerait. Je suis en train de tester avec fgetcsv maintenant. Il y a toujours un 0 booléen comme dernier élément du tableau retourné. – Vordreller

1

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, allthough mon fichier CSV a seulement 2 lignes, il retourne 2 tableaux et 1 booléen. Les 2 premiers sont mes tableaux de données et le booléen est 0.

0

La meilleure façon est bien sûr fgetcsv() comme indiqué.

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

Mais si vous avez le contenu d'une variable et que vous voulez le diviser, et str_getcsv 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; 
}