Как мне проанализировать 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
)
7 ответов
Для чтения всего сразу вы можете использовать:
$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, отлично работает, и его легче читать и понимать. Затем весь результат сохраняется в массиве $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);
}
Я изменил первый ответ, чтобы лучше обрабатывать различные разделители столбцов
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);
}
Вы не можете просто сделать один 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 в массив
это должно решить твою проблему...
Похоже, что это может быть все в одной строке. Возможно, у вашего CSV другое окончание строки, чем должно быть? По крайней мере, так выглядит ваш вывод. Если вы посмотрите на строку 1, столбец 5 в массиве результатов, он содержит окончание строки и столбец 1 в строке 2. И то же самое в остальных. Все это читается одной строкой.
Примечание. Если PHP неправильно распознает окончания строк при чтении файлов на компьютере Macintosh или созданных на нем, включение опции конфигурации auto_detect_line_endings во время выполнения может помочь решить проблему. - fgetscv
На какой ты платформе? В любом случае, проверьте окончания строки.