2010-08-05 15 views
5

Así que tener un archivo CSV que se parece a esto:¿Cómo puedo analizar un CSV en una matriz con el primer valor como clave?

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

¿Cómo puedo insertar este en una matriz que se parece a lo que

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

Esto es lo que actualmente tenía que conseguir un solo numérica valor basado en un CSV de un nivel

 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."); 

     } 

Gracias por las respuestas, pero todavía veo un problema potencial. Con estas soluciones, no sería la tienda de los valores de esta manera:

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

Si intentado esto en el ejemplo csv arriba, cómo se estructura la matriz?

+0

Haz comas de producirse en el texto? – Sjoerd

+0

Su delimitador debe ser '','', not '" \ r "' – meagar

+2

Lo que pregunta ... no se puede hacer, las computadoras no son capaces de tal magia negra. Tendría que escribir varios miles de líneas de código en el ensamblador y tener al menos 16 núcleos en su computadora para intentarlo. – MooGoo

Respuesta

10

Puede usar fgetcsv() para leer una línea de un archivo en una matriz. Así que algo como esto:

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

reemplazar 'fopen' con' fgetcsv' – Sarfraz

+0

+1 elegante y eficiente – Artefacto

+0

@Sarfaz: erm, 'fgetcsv' todavía requiere un identificador de' fopen'? ¿O solía haber un 'fread' que necesitaba ser reemplazado? – Wrikken

0

Si está leyendo un archivo que puedo recomendar el uso de algo así como fgetcsv() Esto leerá cada línea de la CSV en una matriz que contiene todas las columnas como valores.

http://at2.php.net/fgetcsv

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

edición - basado en el código publicado después de la pregunta original:

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

Esto realmente puede hacer el truco ... Me pondré en contacto con usted :) – ThinkingInBits

+0

Error fatal: [] operador no compatible con cadenas en C: \ xampp \ htdocs \ hint_updater \ index.php en la línea 39 – ThinkingInBits

+0

Vaya, jaja , bueno, $ qid se usa tanto para la cadena como para la matriz, no lo noté. Intente redeclar $ qid como una matriz antes del bucle "foreach" como lo hizo en su código $ csv_lines = explode ($ csvDelim, $ csvData); $ qid = array(); foreach ($ csv_lines as $ line) { $ qid [] = explode (',', $ línea, 1); } También podría ser bueno hacer $ qid_array para que no pierda la cadena del archivo original. – clumsyfingers

0

Con su nuevo archivo con dos columnas, $ qid debe convertirse en una matriz con dos valores para cada línea.

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

Suponiendo que la primera fila del archivo CSV contiene los encabezados de columna, esto creará una matriz asociativa utilizando los encabezados de los datos de cada fila:

$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); 
Cuestiones relacionadas