2010-08-05 8 views
5

donc j'ai un fichier CSV qui ressemble à ceci:Comment puis-je analyser un fichier CSV dans un tableau avec la première valeur comme clé?

12345, Here is some text 
20394, Here is some more text 

Comment puis-je insérer ce dans un tableau qui ressemble si

$text = "12345" => "Here is some text", 
     "20394" => "Here is some more text"; 

C'est ce que j'avais actuellement pour obtenir un seul numérique valeur basée sur un CSV à un niveau

 if ($handle = fopen("$qid", "r")) { 

      $csvData = file_get_contents($qid); 
      $csvDelim = "\r"; 

      $qid = array(); 
      $qid = str_getcsv($csvData, $csvDelim); 

     } else { 

      die("Could not open CSV file."); 

     } 

Merci pour les réponses, mais je vois toujours un problème potentiel. Avec ces solutions, ne serait pas le magasin de valeurs de cette façon:

$array[0] = 12345 
$array[1] = Here is some text 20394 
$array[2] = Here is some more text 

Si j'ai essayé cela sur le csv exemple ci-dessus, comment le tableau est structuré?

+0

se produisent des virgules dans le texte? – Sjoerd

+0

Votre délimiteur devrait être '', '', pas' '\ r" ' – meagar

+2

Ce que vous demandez ... cela ne peut pas être fait, les ordinateurs ne sont pas capables d'une telle magie noire. Vous devez écrire plusieurs milliers de lignes de code dans assembler et avoir au moins 16 cœurs dans votre ordinateur pour même tenter. – MooGoo

Répondre

10

Vous pouvez utiliser fgetcsv() pour lire une ligne d'un fichier dans un tableau. Donc, quelque chose comme ceci:

$a = array(); 
$f = fopen(....); 
while ($line = fgetcsv($f)) 
{ 
    $key = array_shift($line); 
    $a[$key] = $line; 
} 
fclose($f); 
var_dump($a); 
+0

remplacer 'fopen' par' fgetcsv' – Sarfraz

+0

+1 élégant et efficace – Artefacto

+0

@Sarfaz: erm, 'fgetcsv' nécessite toujours un handle de' fopen'? Ou y avait-il une «fread» à remplacer? – Wrikken

0

Si vous lisez un fichier que je peux vous recommandons d'utiliser quelque chose comme fgetcsv() Cela va lire chaque ligne du fichier CSV dans un tableau contenant toutes les colonnes en tant que valeurs.

http://at2.php.net/fgetcsv

0
$csv_lines = explode('\n',$csv_text); 
foreach($csv_lines as $line) { 
    $csv_array[] = explode(',',$line,1); 
} 

modifier - basé sur le code affiché après question initiale:

if ($handle = fopen("$qid", "r")) { 

     $csvData = file_get_contents($qid); 
     $csvDelim = "\r"; // assume this is the line delim? 

     $csv_lines = explode($csvDelim,$csvData); 
     foreach($csv_lines as $line) { 
     $qid[] = explode(',',$line,1); 
     } 

    } else { 

     die("Could not open CSV file."); 

    } 
+0

Cela peut effectivement faire l'affaire ... Je vais revenir à vous :) – ThinkingInBits

+0

Erreur fatale: [] opérateur non pris en charge pour les chaînes dans C: \ xampp \ htdocs \ hint_updater \ index.php sur la ligne 39 – ThinkingInBits

+0

Oups, haha , bien, $ qid est utilisé pour la chaîne et le tableau, je n'ai pas remarqué cela. Essayez de redéclarer $ qid comme un tableau avant la boucle "foreach" comme vous l'avez fait dans votre code $ csv_lines = explode ($ csvDelim, $ csvData); $ qid = array(); foreach ($ csv_lines comme ligne) { $ qid [] = explode (',', $ ligne, 1); } Il serait peut-être bon de faire aussi $ qid_array pour ne pas perdre la chaîne de fichier d'origine. – clumsyfingers

0

Avec votre nouveau fichier avec deux colonnes, qid $ devrait devenir un tableau avec deux valeurs pour chaque ligne.

$csvDelim = ","; 
$qid = str_getcsv($csvData, $csvDelim); 
$text[$qid[0]] = $qid[1]; 
3

En supposant que la première ligne dans le fichier CSV contient les en-têtes de colonne, cela va créer un tableau associatif en utilisant les en-têtes pour les données de chaque ligne:

$filepath = "./test.csv"; 
$file = fopen($filepath, "r") or die("Error opening file"); 
$i = 0; 

while(($line = fgetcsv($file)) !== FALSE) { 
    if($i == 0) { 
     $c = 0; 
     foreach($line as $col) { 
      $cols[$c] = $col; 
      $c++; 
     } 
    } else if($i > 0) { 
     $c = 0; 
     foreach($line as $col) { 
      $data[$i][$cols[$c]] = $col; 
      $c++; 
     } 
    } 
    $i++; 
} 

print_r($data); 
Questions connexes