Отображать последние введенные данные из файла CSV в PHP?

У меня есть файл CSV с начальной строкой заголовка и неизвестным количеством строк. Формат строки:

name_data, email_data, cell_data, dob_data

Я хотел бы открыть файл CSV, а затем отобразить данные из последней введенной строки в таблице, например:

Name: name_data
Email: email_data
Cell: cell_data
D.O.B.: dob_data

Я думаю, что могу использовать fgetcsv(), но я не уверен, как анализировать данные после их получения.

Любые идеи?

Спасибо - Джо


person Joe Lowery    schedule 10.07.2013    source источник
comment
пример один на странице maual для fgetcsv - отличное начало   -  person    schedule 10.07.2013


Ответы (2)


Кажется неэффективным анализировать каждую строку файла с помощью fgetcsv(), когда вам нужны только первая и последняя строки. Таким образом, я бы использовал file() и str_getcsv():

$rows = file('data.csv');
$last_row = array_pop($rows);
$data = str_getcsv($last_row);
// loop and output data

Примечание. Вы можете использовать ту же логику для заголовков, анализируя $rows[0].

person Jason McCreary    schedule 10.07.2013
comment
Компромисс между моей и вашей версиями заключается в том, что у вас по-свински с пространством, а у меня по-свински с процессорным временем. Мой второй подход должен быть хорошим компромиссом. - person Orangepill; 10.07.2013
comment
Это отлично сработало для меня и кажется очень чистым. Спасибо. - person Joe Lowery; 10.07.2013

$fp = fopen("csvfile.csv", "r");
// read all each of the records and assign to $rec;
while ($rec = fgetcsv($fp)){} 
?>
// rec will end up containing the last line
<table>
<tr><td>Name:</td><td><?= $rec[0] ?></td></tr>
<tr><td>Email : </td><td><?= $rec[1] ?></td></tr>
<tr><td>Cell :</td><td> <?= $rec[2] ?></td></tr>
<tr><td>D.O.B :</td><td> <?= $rec[3] ?></td></tr>
</table>

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

$filesize = filesize("csvfile.csv");
$maxRecordLength = 2048;
$fp = fopen("csvfile.csv", "r");
// start near the end of the file and read til the end of the line
fseek($fp, max(0, $filesize - ($maxRecordLength *2));
fgets($fp);
// then do same as above
while ($rec = fgetcsv($fp)){}
?>
<table>
<tr><td>Name:</td><td><?= $rec[0] ?></td></tr>
<tr><td>Email : </td><td><?= $rec[1] ?></td></tr>
<tr><td>Cell :</td><td> <?= $rec[2] ?></td></tr>
<tr><td>D.O.B :</td><td> <?= $rec[3] ?></td></tr>
</table>
person Orangepill    schedule 10.07.2013
comment
Приятное упоминание опции fseek(). Но вы делаете предположения о размере каждой строки. - person Jason McCreary; 10.07.2013
comment
@JasonMcCreary Верно ... но, зная данные, я думаю, что можно найти безопасное и разумное значение. - person Orangepill; 10.07.2013
comment
Добавлен вызов max для fseek, чтобы мы могли убедиться, что указатель файла никогда не располагается перед началом файла. - person Orangepill; 10.07.2013