how do i parse a csv file to grab the column names first then the rows that relate to it?

59,069

Solution 1

For reading it all at once you can use:

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

To turn all the rows into a nice associative array you could then apply:

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

Solution 2

// 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'];
}

Solution 3

I made this quick solution using fgetcsv, works fine and it's easier to read and understand. Then the whole result is saved in the $csv array

$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);
}
Share:
59,069

Related videos on Youtube

Exploit
Author by

Exploit

I have been a web developer for more than 8 years now and currently a full stack web developer. I have experience with: Languages/Libraries Html CSS Javascript Jquery Vue-js Bootstrap 3/4/5 PHP Frameworks Codeigniter Laravel Systems Ubuntu Terminal batch scripting Platforms Wordpress Shopify

Updated on July 09, 2022

Comments

  • Exploit
    Exploit almost 2 years

    here is my 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
    

    first row is the column names of course. i tried fgetcsv() but all that would do is display all rows. rather than what i want. how can i do it?

    so if i were to put the data into an array at the end i would be able print out a table format of the data just like its shown in excel.

    thanks

    this is my sample:

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

    this is my output: (i put the $row into a pre so i can show it)

    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
    )
    
  • Lemon
    Lemon about 13 years
    @Sarmen: Added sample. haven't tested it though. let me know if it works.
  • Exploit
    Exploit about 13 years
    ps i added what i was attempting.
  • Exploit
    Exploit about 13 years
    i tried your sample but i didnt get an output. know why that would be?
  • Fidi
    Fidi about 13 years
    only works if your column-names are 'column1', 'column2', etc. like in your example. echo $column['the_name_of_your_column_in_the_headrow'];
  • Exploit
    Exploit about 13 years
    yea i did , nothing came out so i did a print_r of $column and nothing . here is the pastie pastie.org/1796761
  • Fidi
    Fidi about 13 years
    Do you have error_reporting enabled? If not, do it and look if an error occurred. do you reach the while loop? paste an die(x); for debugging into the loop to see if it is executed. If not, the file is empty or the filepointer ($fp) is not set (e.g. invalid path).
  • Cups
    Cups about 11 years
    Good solution for anyone stuck on pre 5.3
  • Michiel
    Michiel almost 11 years
    How can I use this with a ; as seperator?
  • Tapper
    Tapper over 9 years
    @Michiel, how to use a different separator: $file = file("file1.csv",FILE_SKIP_EMPTY_LINES); $csv = array_map("str_getcsv",$file, array_fill(0, count($file), ';'));
  • pzirkind
    pzirkind over 8 years
    @mario this falls into my favorite category of answers. short, works as advertised and most important it teaches me new functionality
  • FKEinternet
    FKEinternet about 6 years
    Note this only works if all of your data rows are the same length as the header row.
  • Yoann
    Yoann over 5 years
    This is more memory efficient than accepted response.

Related