web-dev-qa-db-fra.com

comment puis-je analyser un fichier csv pour récupérer les noms de colonne en premier, puis les lignes qui le concernent?

voici mon csv

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

la première ligne est le nom des colonnes bien sûr. J'ai essayé fgetcsv () mais tout ce que je ferais serait d'afficher toutes les lignes. plutôt que ce que je veux. Comment puis-je le faire?

donc, si je devais mettre les données dans un tableau à la fin, je serais en mesure d'imprimer un format de tableau des données, exactement comme dans Excel.

merci

voici mon échantillon:

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

voici ma sortie: (je mets la rangée $ dans un pré afin de pouvoir la montrer) 

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
)
18
Sarmen B.

Pour tout lire en une fois, vous pouvez utiliser:

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

Pour transformer toutes les lignes en un tableau associatif de Nice, vous pouvez ensuite appliquer:

foreach ($csv as $i=>$row) {
    $csv[$i] = array_combine($keys, $row);
}
59
mario
// 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'];
}
3
Alex Sawallich

essayez d'utiliser str_getcsv - Analyse d'une chaîne CSV dans un tableau 

cela devrait résoudre votre problème ...

0
Hacker

J'ai créé cette solution rapide en utilisant fgetcsv, cela fonctionne bien et il est plus facile à lire et à comprendre. Ensuite, le résultat entier est enregistré dans le tableau $ csv

$csv = array();
$i = 0;
if (($handle = fopen($upload['file'], "r")) !== false) {
    $columns = fgetcsv($handle, 1000, ",");
    while (($row = fgetcsv($handle, 1000, ",")) !== false) {
        $csv[$i] = array_combine($columns, $row);
        $i++;
    }
    fclose($handle);
}
0
Macr1408

On dirait que cela pourrait être considéré comme une seule ligne. Peut-être que votre csv a une fin de ligne différente de celle qu'elle devrait avoir? Au moins c'est ce que cela ressemble dans votre sortie. Si vous regardez la ligne 1, la colonne 5 de votre tableau de résultats, elle contient une fin de ligne et la colonne 1 de la ligne 2. Et la même chose pour le reste. Tout se lit en une seule ligne.

Remarque: Si PHP ne reconnaît pas correctement les fins de ligne lors de la lecture de fichiers sur un ordinateur Macintosh ou créés par un ordinateur Macintosh, l'activation de l'option auto_detect_line_endings run-time peut aider à résoudre le problème. - fgetscv

Sur quelle plateforme es-tu? Quoi qu'il en soit, vérifiez les fins de ligne.

0
Svish

J'ai modifié la première réponse pour mieux gérer différents séparateurs de colonnes

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);
}
0
StanleyD

Ne pouvez-vous pas simplement passer un appel fgetcsv pour obtenir les en-têtes, puis démarrer une boucle pour obtenir le reste?

Modification de l'exemple trouvé dans le manuel . Il devrait écrire un tableau avec les en-têtes et les valeurs suivantes.

<?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
Svish