PHP для удаления последней строки файла CSV

все еще борюсь с манипулированием файлами PHP и CSV. Я постараюсь задать этот вопрос правильно, чтобы получить помощь.

У меня есть CSV-файл, содержащий около 4000 строк/строк, и я написал этот код, чтобы создать массив всего CSV-файла и вытащить ПОСЛЕДНЮЮ строку CSV-файла для использования в моем скрипте. Код работает ко всему этому с успехом.

// CREATE ASSOCIATIVE ARRAY FROM LAST ROW OF CSV FILE
$csv = array();
if (FALSE !== $handle = fopen("Alabama-TEST.csv", "r"))
{
while (FALSE !== $row = fgetcsv($handle))
{
 $csv[] = $row; 
}
}
$new_csv = array();
foreach ($csv as $row)
{
$new_row = array();
for ($i = 0, $n = count($csv[0]); $i < $n; ++$i)
{
$new_row[$csv[0][$i]] = $row[$i]; 
}
$new_csv[] = $new_row;
}

Переменная $new_row является последней строкой в ​​CSV, и я могу нормально использовать данные. Но когда скрипт завершится, я хочу удалить эту последнюю строку с именем $new_row.

Вот пример моего файла CSV в виде сверху;

CITY        ADDRESS        STATE      NAME
Birmingham  123 Park St.   Alabama    Franky

Поэтому я просто хочу удалить последнюю строку и сохранить заголовок вверху для следующего запуска сценария. Я пытался в течение 3 дней, пытаясь понять это, поэтому я надеюсь, что какой-нибудь добрый человек, который ЗНАЕТ, ЧТО ОНИ ДЕЛАЮТ, может помочь.

Вот код, который я пытался удалить последней строкой;

$inp = file('Alabama-TEST.csv');
$out = fopen('Alabama-TEST.csv','w');
or ($i=0;$i<count($inp)-1;$i++)
fwrite($out,$inp[$i]);
fclose($out);

Поскольку я использую большой файл, содержащий около 4000 строк, есть ли способ сделать это, не используя слишком много памяти?


person Community    schedule 24.11.2013    source источник
comment
Поскольку $n содержит количество строк, почему $i ‹ $n - 1 не решает эту проблему? может вы не правильно объяснили?   -  person Noam Rathaus    schedule 24.11.2013
comment
Код, который я показал, отлично работает для получения переменной $new_row, так что в этом нет ничего плохого - я ищу, чтобы удалить последнюю строку, прежде чем скрипт снова запустится. Я предполагал, что удаление $new_row сделает это. Я добавлю выше код, который я пытался удалить последней строкой.   -  person    schedule 24.11.2013
comment
Вы хотите написать новую версию Alabama-TEST.csv без последней строки?   -  person Noam Rathaus    schedule 24.11.2013
comment
@nrathaus - Да, это именно то, что я пытаюсь сделать.   -  person    schedule 24.11.2013
comment
hashbangcode.com/blog/remove-last-line- file-php-478.html Возможно, это поможет   -  person mipmap    schedule 24.11.2013
comment
Спасибо @mipmap - я проверю.   -  person    schedule 24.11.2013


Ответы (1)


Вам нужно использовать array_pop в вашем массиве ($new_csv) и fputcsv, чтобы сохранить файл:

array_pop($new_csv); // Removes the last element in the array
$out = fopen('Alabama-TEST-new.csv','w');
foreach ($new_csv as $row) { // sorry for writing it badly, try now
 fputcsv($out, $row);
}
fclose($out);

У меня нет среды, чтобы проверить это, извините.

person Noam Rathaus    schedule 24.11.2013
comment
Спасибо - попробовал, и он заработал без ошибок - к сожалению, он не удалил последнюю строку в CSV - я думаю, что вы действительно близки, потому что он в любом случае не исказил файл CSV. - person ; 24.11.2013
comment
Вы заметили, что я намеренно отредактировал Alabama-TEST-new.csv, а не исходный файл? :) - person Noam Rathaus; 24.11.2013
comment
Извините - я не использовал Alabama-TEST-new.csv - я попробую еще раз - person ; 24.11.2013
comment
Я сделал это, чтобы предотвратить перезапись вашего исходного файла, вы использовали то же имя файла, что и не было изменений? - person Noam Rathaus; 24.11.2013
comment
Неплохо! Этот новый файл идеален. Единственная проблема в том, что я хочу запустить скрипт во второй раз, используя новый CSV, и снова, снова... - person ; 24.11.2013
comment
Да, я снова запустил сценарий и использовал оригинальный Alabama-TEST.csv, поэтому, конечно, последняя строка все еще была. Чувак... мы на грани решения. Поэтому я хочу перезаписать исходный файл. У меня есть резервная копия - спасибо за это. - person ; 24.11.2013
comment
Поэтому либо измените имя выходного файла, не должно быть условий гонки, либо используйте текущее имя файла, а затем вызовите функцию rename(). - person Noam Rathaus; 24.11.2013
comment
Никогда не использовал функцию rename() - как бы это выглядело в этом случае?? - person ; 24.11.2013
comment
rename('Alabama-TEST-new.csv', 'Alabama-TEST.csv'), но, как уже упоминалось, вам может не понадобиться это делать, вы пытались открыть и сохранить файл с тем же именем? - person Noam Rathaus; 24.11.2013
comment
Поменял имя файла - работает!!!!!!!!!!! ТАК ТАК ТАКОЕ большое спасибо за вашу помощь - вы остались со мной в этом до конца!! - person ; 24.11.2013