how do i parse a csv file to grab the column names first then the rows that relate to it?
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);
}
Related videos on Youtube
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, 2022Comments
-
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 about 13 years@Sarmen: Added sample. haven't tested it though. let me know if it works.
-
Exploit about 13 yearsps i added what i was attempting.
-
Exploit about 13 yearsi tried your sample but i didnt get an output. know why that would be?
-
Fidi about 13 yearsonly works if your column-names are 'column1', 'column2', etc. like in your example.
echo $column['the_name_of_your_column_in_the_headrow'];
-
Exploit about 13 yearsyea i did , nothing came out so i did a print_r of $column and nothing . here is the pastie pastie.org/1796761
-
Fidi about 13 yearsDo 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 about 11 yearsGood solution for anyone stuck on pre 5.3
-
Michiel almost 11 yearsHow can I use this with a
;
as seperator? -
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 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 about 6 yearsNote this only works if all of your data rows are the same length as the header row.
-
Yoann over 5 yearsThis is more memory efficient than accepted response.