как разобрать файл csv, чтобы сначала захватить имена столбцов, а затем строки, относящиеся к нему?

вот мой 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 

первая строка – это имена столбцов, конечно. Я попробовал fgetcsv (), но все, что было бы, это отобразить все строки. а не то, что я хочу. как мне это сделать?

поэтому, если бы я должен был помещать данные в массив в конце, я смог бы распечатать формат таблицы данных так же, как и показанный в excel.

благодаря

это мой пример:

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

это мой вывод: (я ставлю строку $ в pre, чтобы я мог ее показать)

 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 ) 

Для прочтения всего этого вы можете использовать:

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

Чтобы превратить все строки в хороший ассоциативный массив, вы можете применить:

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

Разве вы не можете сделать один вызов fgetcsv первым, чтобы получить заголовки, а затем запустить цикл, чтобы получить остальное?

Изменен пример, приведенный в руководстве . Он должен выписать таблицу со следующими заголовками и значениями.

 <?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>'; } ?> 

попробуйте использовать str_getcsv – Разберите строку CSV в массив

он должен решить проблему ur …

Похоже, что все это можно считать одной строкой. Возможно, у вашего csv есть отличная строка, чем должна быть? По крайней мере, это то, что похоже на ваш выход. Если вы посмотрите на строку 1, столбец 5 в вашем массиве результатов, она содержит строку окончания и столбец 1 в строке 2. И то же самое в остальном. Он читает все это как одну строку.

Примечание. Если PHP неправильно распознает окончание строки при чтении файлов, которые были созданы или созданы компьютером Macintosh, включение опции конфигурации времени автономной работы auto_detect_line_endings может помочь решить проблему. – fgetscv

На какой платформе вы работаете? В любом случае, проверьте окончания строки.

Я изменил первый ответ, чтобы лучше обрабатывать разные разделители столбцов

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