Удалить текущую итерационную строку из файла CSV в PHP
Я хочу удалить текущую итерирующую строку из файла CSV. Предположим, у меня есть 5 строк (1,2,3,4,5) в файл CSV, я открыл свой файл, итерации строк один за другим, используя foreach, когда дело доходит до 3-я строка, а затем 3-я строка должна быть удалена из файла CSV, а остальные 1,2,4,5 строки будут одинаковыми при одной и той же итерации. Я не хочу использовать, например, пропустить 3-ю итерацию и сохранить ее в другом файле, а не как переименовать имя файла. Итак, пожалуйста, кто-нибудь может мне помочь, как это сделать на PHP? Предположим, как и команда SQL для удаления текущей строки, есть ли что-нибудь в PHP? Благодарю.
Почему вы против чтения файла и записи нового файла без строк, которые вы хотите удалить? Вы должны избегать проблем с памятью при работе с большими файлами.
Лучше всего сделать резервную копию файла, прочитать его и записать изменения в первый. Все счастливы!
@ X33 На самом деле я использую это в magento наблюдателях, наблюдатель загружается каждый раз, когда я перезагружаю свой продукт. Так что, по моему требованию, сохранение данных в новый файл не будет работать.
1 ответ
Вам нужно будет иметь разрешения на запись файла. Если вы удалите строку, вам придется сохранить файл. Поскольку вы также не хотите иметь пустые строки, вам нужно прочитать весь файл.
Я предлагаю получить содержимое файла и разделить его на массив по строкам. С помощью функции разрыва вы можете разделить содержимое на разрыв строки, скорее всего, «\n». Таким образом, будет существовать массив, который будет содержать каждую строку файла csv. Теперь вы можете просто удалить строку из массива и создать строку из нее, прежде чем сохранять измененный контент обратно в файл csv.
// get csv content into string variable $csvContent = file_get_contents(__DIR__ . "/yourfile.csv"); // create array out of csv, limited by PHP_EOL wich determines the systems line break // this means, every line in the csv file will be represended by an array key and its value $csvArray = explode(PHP_EOL, $csvContent); // unset the 3th csv line. unset($csvArray[2]); // keep in mind array starts at 0, so third line is array key 2 // from here on you can manipulate the array $csvArray as you like. // add lines, remove lines or just use the given content for future operations. // you can also iterate over the array with: foreach ($csvArray as $line => $value) <> // create string out of modified csv array $csvContent = implode(PHP_EOL, $csvArray); // save result back into the csv file file_put_contents( __DIR__ . "/yourfile.csv", $csvContent);
Проверяйте документацию по функциям imode/explode php:
Как удалить определенные строки из файла csv в php?
У меня есть такой CSV-файл: Я хотел бы удалить первые 3 строки, а также строку «Данные по состоянию на», чтобы иметь только мою таблицу значений. Я попробовал array_shift($csv_data); , но он удаляет только первую строку, как мне это сделать?
fclose($handle); > //delete fist 3 lines array_shift($csv_data); if (($handle = fopen($nomcsv, 'w')) !== FALSE) < foreach ($csv_data as $data) < fputcsv($handle, $data, $delimiter); >fclose($handle); > ?>
На этот вопрос уже был дан ответ здесь: stackoverflow.com/questions /38489240/ — person jspit   schedule 12.10.2020
Ответы (2)
$csv_data = array_slice($csv_data, 3); // this will remove first three elements array_pop($csv_data);// this will remove last element from array
$delimiter = ";"; $csv_data = array(); $row = 1; if (($handle = fopen($nomcsv, 'r')) !== FALSE) < while (($data = fgetcsv($handle, 10000, $delimiter)) !== FALSE) < //Add columns with the name of pictures at the end of file : style_color.jpg $data['Pictures Names'] = (!empty($data[4]) ? ($data[7] ?: '') . "_" . $data[4] . '.jpg' : ''); //Delete two columns with pictures unset($data[1]); unset($data[2]); if ($row >3)//start adding after third row if (strpos($data[0], "Data as of") !== 0)//Dont add any line that starts with 'Data as of' $csv_data[] = $data; $row++; > fclose($handle); >
Если я правильно понял ваш вопрос, вы хотите удалить первые три строки, но выполнить array_shift только один раз. Самым простым решением было бы использовать функцию array_shift три раза.
//delete fist 3 lines array_shift($csv_data); array_shift($csv_data); array_shift($csv_data);
Что касается удаления даты: если это последняя запись (или строка) в вашем CSV-файле, вы можете использовать array_pop($csv_data) , который удаляет последнюю запись из массива. Если это не последняя строка, вы можете отфильтровать ее внутри цикла while, заполняя массив $csv_data :
if(substr($data[0], 0, 4) === "data") < continue; >$csv_data[] = $data;
Это пропустит каждую строку, где первая строка ячейки начинается с данных, поэтому она даже не попадет в массив $csv_data.
Удаление строк из файла CSV с помощью PHP
Я использую следующий код, чтобы вытащить CSV файл с веб-сайта, на котором у меня нет контроля. и много раз я получаю неопределенный индекс или заголовки, уже отправленные, но все данные находятся внизу. Я хочу написать скрипт, чтобы открыть файл и удалить все строки до тех пор, пока он не попадет в фактическую строку заголовка, которая должна находиться в csv. количество строк меняется каждый раз, когда я тяну его. в текущем примере есть 49107 строк, которые мне не нужны, прежде чем часть, которую я хочу проанализировать. Это небольшая часть первых 15 строк кода и около 20 строк кода до того, что я ДЕЙСТВИТЕЛЬНО ХОЧУ из файла.
Notice (8): Undefined index: name [APP/controllers/loads_controller.php line 327]name,load_number,trailer_type,phone_number1,phone_number2,pickup_date,drop_date,pickup_city,pickup_state,pickup_zipcode,destination_city,destination_state,destination_zipcode "FOOD OR KINDRED PROD",8831029,R,800-555-8287,800-555-8287,03/09/2014,03/10/2014,Aurora,Illinois,60504,"West Memphis",Arkansas,72301 "FOOD OR KINDRED PROD",8831031,R,800-555-8287,800-555-8287,03/12/2014,03/13/2014,Aurora,Illinois,60504,Ashley,Indiana,46705
name,load_number,trailer_type,phone_number1,phone_number2,pickup_date,drop_date,pickup_city,pickup_state,pickup_zipcode,destination_city,destination_state,destination_zipcode FOOD OR KINDRED PROD,8831029,R,800-555-8287,800-555-8287,3/9/2014,3/10/2014,Aurora,Illinois,60504,West Memphis,Arkansas,72301 FOOD OR KINDRED PROD,8831031,R,800-555-5555,800-555-5555,3/12/2014,3/13/2014,Aurora,Illinois,60504,Ashley,Indiana,46705
set_time_limit (24 * 60 * 60); // folder to save downloaded files to. must end with slash $destination_folder = 'downloads/'; $url = 'http://www.somesite.com/loads/csv'; $newfname = $destination_folder . 'loads1.csv'; $file = fopen ($url, "rb"); if ($file) < $newf = fopen ($newfname, "wb"); if ($newf) while(!feof($file)) < fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 ); >> if ($file) < fclose($file); >if ($newf)$selectfile1 = "https://www.somesite.com/downloads/loads1.csv"; // check mime type - application/octet-stream $content = file($selectfile1); $posted_content = array(); list($rownum, $row) = each($content); $posted_content[0] = explode(",", $row); array_push($posted_content[0], "ID"); $count = 0; // iterate each row (1 post) while (list($rownum, $row) = each($content)) < $count++; $cols = "ShipAfterDate, ShipBeforeDate, EquipmentID, LengthID, VendorCode, LoadCount, Rate, CargoDescription, Notes,Phone1, Phone2, PostDate,"; $vals = ""; // extract fields from row columns $items = explode(",", $row); list( $Description, $OrderNumber, $EquipmentCode, $Phone1, $Phone2, $ShipDate, $DeliveryDate, $OriginCity, $OriginState, $OriginZip, $DestinationCity, $DestinationState, $DestinationZip ) = $items; array_push($posted_content, $items);
Хорошо, я покажу вам простой и глупый способ сделать это, но должно быть несколько условий: 1). Этот код всегда один и тот же? Очень простым способом было бы взорваться этим