2011-04-15 7 views
15

aquí es mi csv¿cómo se analiza un archivo csv para captar los nombres de las columnas primero y luego las filas que se relacionan con él?

column1,column2,column3,column4,column5 
column1_row1,column2_row1,column3_row1,column4_row1,column5_row1 
column1_row2,column2_row2,column3_row2,column4_row2,column5_row2 
column1_row3,column2_row3,column3_row3,column4_row3,column5_row3 
column1_row4,column2_row4,column3_row4,column4_row4,column5_row4 
column1_row5,column2_row5,column3_row5,column4_row5,column5_row5 
column1_row6,column2_row6,column3_row6,column4_row6,column5_row6 
column1_row7,column2_row7,column3_row7,column4_row7,column5_row7 
column1_row8,column2_row8,column3_row8,column4_row8,column5_row8 
column1_row9,column2_row9,column3_row9,column4_row9,column5_row9 

primera fila es los nombres de columna, por supuesto. probé fgetcsv() pero todo lo que haría sería mostrar todas las filas. en lugar de lo que quiero ¿Cómo puedo hacerlo?

así que si tuviera que poner los datos en una matriz al final podría imprimir un formato de tabla de los datos tal como se muestra en excel.

gracias

este es mi muestra:

$filename = "upload/sample.csv"; 
if (($handle = fopen($filename, 'r')) !== FALSE) 
{ 
    while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) 
    { 
     print_r($row); 
    } 
} 

este es mi resultado: (i poner la fila $ en un pre para que pueda demostrarlo)

Array 
(
    [0] => column1 
    [1] => column2 
    [2] => column3 
    [3] => column4 
    [4] => column5 
column1_row1 
    [5] => column2_row1 
    [6] => column3_row1 
    [7] => column4_row1 
    [8] => column5_row1 
column1_row2 
    [9] => column2_row2 
    [10] => column3_row2 
    [11] => column4_row2 
    [12] => column5_row2 
column1_row3 
    [13] => column2_row3 
    [14] => column3_row3 
    [15] => column4_row3 
    [16] => column5_row3 
column1_row4 
    [17] => column2_row4 
    [18] => column3_row4 
    [19] => column4_row4 
    [20] => column5_row4 
column1_row5 
    [21] => column2_row5 
    [22] => column3_row5 
    [23] => column4_row5 
    [24] => column5_row5 
column1_row6 
    [25] => column2_row6 
    [26] => column3_row6 
    [27] => column4_row6 
    [28] => column5_row6 
column1_row7 
    [29] => column2_row7 
    [30] => column3_row7 
    [31] => column4_row7 
    [32] => column5_row7 
column1_row8 
    [33] => column2_row8 
    [34] => column3_row8 
    [35] => column4_row8 
    [36] => column5_row8 
column1_row9 
    [37] => column2_row9 
    [38] => column3_row9 
    [39] => column4_row9 
    [40] => column5_row9 
) 
+0

¿Qué hay de malo en usar 'fgetcsv' y luego caminar a través de cada línea? –

+0

¿me puede mostrar una muestra de su método? entonces señalaré lo que me confunde –

+0

Realmente no tengo una muestra. ¿Puedes mostrar los tuyos y lo que no funciona? –

Respuesta

51

Para leer todo a la vez que puede utilizar:

$csv = array_map("str_getcsv", file("file1.csv",FILE_SKIP_EMPTY_LINES)); 
$keys = array_shift($csv); 

Para activar todas las filas en un buen arreglo asociativo que luego podría aplicar:

foreach ($csv as $i=>$row) { 
    $csv[$i] = array_combine($keys, $row); 
} 
+1

¿Cómo puedo usar esto con un ';' como separador? – Michiel

+0

De esta manera no puede tratar con interruptores de línea en una celda. – Michael

+3

@Michiel, cómo usar un separador diferente: '$ file = file (" file1.csv ", FILE_SKIP_EMPTY_LINES); $ csv = array_map ("str_getcsv", $ file, array_fill (0, count ($ file), ';')); ' – Tapper

0

Pueden' t simplemente haga una llamada fgetcsv primero para obtener los encabezados, y luego inicie un ciclo para obtener el resto?

Modificó el ejemplo encontrado in the manual. Debería escribir una tabla con los encabezados y valores siguientes.

<?php 
$row = 1; 
if (($handle = fopen('test.csv', 'r')) !== FALSE) 
{ 
    echo '<table>'; 

    // Get headers 
    if (($data = fgetcsv($handle, 1000, ',')) !== FALSE) 
    { 
     echo '<tr><th>'.implode('</th><th>', $data).'</th></tr>'; 
    } 

    // Get the rest 
    while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) 
    { 
     echo '<tr><td>'.implode('</td><td>', $data).'</td></tr>'; 
    } 
    fclose($handle); 
    echo '</table>'; 
} 
?> 
+0

¿me puede mostrar una muestra? –

+0

@Sarmen: muestra adicional. no lo han probado sin embargo. Déjame saber si funciona. – Svish

+0

no funcionó, todos los datos se agregaron como un –

1
// Opening the file for reading... 
$fp = fopen('path_to_your_file.csv', 'r'); 

// Headrow 
$head = fgetcsv($fp, 4096, ';', '"'); 

// Rows 
while($column = fgetcsv($fp, 4096, ';', '"')) 
{ 
    // This is a great trick, to get an associative row by combining the headrow with the content-rows. 
    $column = array_combine($head, $column); 

    echo $column['column1']; 
} 
+0

probé su muestra pero no obtuve una salida. ¿Sabes por qué sería eso? –

+0

solo funciona si sus nombres de columna son 'column1', 'column2', etc. como en su ejemplo. 'echo $ column ['the_name_of_your_column_in_the_headrow'];' –

+0

sí lo hice, no salió nada, así que hice una print_r de $ column y nada. aquí está el pastie http://pastie.org/1796761 –

0

intento usando str_getcsv - Analizar una cadena CSV en una matriz

debería resolver su problema ur ...

+0

hice lo mismo. aquí está el pastie: http://pastie.org/1796729 –

+0

@Sarmen B. - ¿Quiere decir que funcionó para usted? – Hacker

+0

ha estado funcionando, pero no puedo tomar los datos del encabezado de la columna solamente. por ejemplo, si quería poner esto en una tabla html. las etiquetas mantendrían el contenido del encabezado. entonces las etiquetas mantendrían los datos de celda relacionados para los encabezados. entiendo lo que quiero decir? –

0

Parece que podría estar tomando todo como una sola línea. ¿Quizás su csv tiene una terminación de línea diferente a la que debería tener? Al menos eso es lo que parece en tu salida. Si nos fijamos en la fila 1, columna 5 en su matriz de resultados, contiene un final de línea y la columna 1 en la fila 2. Y lo mismo en el resto. Lo lee todo en una sola línea.

Nota: Si PHP no está reconociendo los finales de línea cuando lee archivos ya sea dentro o creado por un ordenador Macintosh, lo que permite la opción de configuración auto_detect_line_endings en tiempo de ejecución puede ayudar a resolver el problema. - fgetscv

¿En qué plataforma estás? De cualquier manera, compruebe los finales de línea.

0

modifiqué primera respuesta a una mejor manejar diferentes separadores de columna

if (($handle = fopen("hdbsource/products_stock.csv", "r")) !== FALSE) { 
    while (($csv[] = fgetcsv($handle, 1000, ',')) !== FALSE) {} 
    fclose($handle); 
} 
$keys = array_shift($csv); 

foreach ($csv as $i=>$row) { 
    $csv[$i] = array_combine($keys, $row); 
} 
Cuestiones relacionadas