Удалить строку csv php

Удалить текущую итерационную строку из файла 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:

Читайте также:  TAG index

Источник

Как удалить определенные строки из файла 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 &nbsp 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]
Code | Context
                $data[$i]['Load']['drop_date'] = date('m/d/Y'  strtotime($value['Load']['drop']));                 $data[$i]['Load']['pickup_city'] = $value['Pickup']['city']; "                $data[$i]['Load']['pickup_state'] = $value['Pickup']['State']['name'];
$order = ""Load.load_number ASC""" "$fields = array(" " ""*""" ) "$conditions = array(" " ""Load.active"" => true" ) "$results = array(" " array(" " ""Load"" => array()" " ""Pickup"" => array()" " ""Destination"" => array()" ) $result = array( "Load" => array( "name" => "ICE CREAM OR RELATED", "load_number" => "8891517", "trailer_type" => "R", "phone_number1" => "800-555-8287", "phone_number2" => "800-555-8287", "pickup_date" => "03/09/2014", "drop_date" => "03/09/2014", "pickup_city" => "Indianapolis", "pickup_state" => "Indiana", "pickup_zipcode" => "46201", "destination_city" => "London", "destination_state" => "Kentucky", "destination_zipcode" => "40741" ) ) $fp=
header - [internal], line ?? LoadsController::csv() - APP/controllers/loads_controller.php, line 360 Dispatcher::_invoke() - CORE/cake/dispatcher.php, line 204 Dispatcher::dispatch() - CORE/cake/dispatcher.php, line 170 [main] - APP/webroot/index.php, line 83

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). Этот код всегда один и тот же? Очень простым способом было бы взорваться этим

\ n - при условии, что это единственное место, где происходит такая комбинация.

Никакой код не должен возвращать загрузку CSV-файла, но когда появляется ошибка заголовка, я получаю это

Источник

Удалить строку из файла CSV

У меня есть .csv файл с 4 столбцами. Какой самый простой способ удалить строку, идентичную идентификатору первого столбца? Вот где я застрял:

if($_GET['id']) < $id = $_GET['id']; $file_handle = fopen("testimonials.csv", "rw"); while (!feof($file_handle) ) < $line_of_text = fgetcsv($file_handle, 1024); if ($id == $line_of_text[0]) < // remove row >> fclose($file_handle); > 

К сожалению, базы данных не были выбором.

$id = $_GET['id']; if($id) < $file_handle = fopen("testimonials.csv", "w+"); $myCsv = array(); while (!feof($file_handle) ) < $line_of_text = fgetcsv($file_handle, 1024); if ($id != $line_of_text[0]) < fputcsv($file_handle, $line_of_text); >> fclose($file_handle); > 

Недавно я сделал аналогичную вещь для подписки на рассылку новостей, вот мой код:

$signupsFile = 'newsletters/signups.csv'; $signupsTempFile = 'newsletters/signups_temp.csv'; $GLOBALS["signupsFile"] = $signupsFile; $GLOBALS["signupsTempFile"] = $signupsTempFile; function removeEmail($email) < $removed = false; $fptemp = fopen($GLOBALS["signupsTempFile"], "a+"); if (($handle = fopen($GLOBALS["signupsFile"], "r")) !== FALSE) < while (($data = fgetcsv($handle)) !== FALSE) < if ($email != $data[0] )< $list = array($data); fputcsv($fptemp, $list); $removed = true; >> fclose($handle); fclose($fptemp); unlink($GLOBALS["signupsFile"]); rename($GLOBALS["signupsTempFile"], $GLOBALS["signupsFile"]); return $removed; > 

это использует метод temp-файла для записи строки csv, чтобы избежать ошибок памяти. Затем, как только новый файл был создан, он удаляет оригинал и переименовывает временный файл.

Вы можете изменить этот код так, чтобы он искал идентификатор вместо адреса электронной почты, например:

$id = $_GET['id']; $fptemp = fopen('testimonials-temp.csv', "a+"); if (($handle = fopen('testimonials.csv', "r")) !== FALSE) < while (($id= fgetcsv($handle)) !== FALSE) < if ($id != $data[0] )< $list = array($data); fputcsv($fptemp, $list); >> fclose($handle); fclose($fptemp); unlink('testimonials.csv'); rename('testimonials-temp.csv','testimonials.csv'); 
$table = fopen('table.csv','r'); $temp_table = fopen('table_temp.csv','w'); $id = 'something' // the name of the column you're looking for while (($data = fgetcsv($table, 1000)) !== FALSE) < if(reset($data) == $id)< // this is if you need the first column in a row continue; >fputcsv($temp_table,$data); > fclose($table); fclose($temp_table); rename('table_temp.csv','table.csv'); 
$new = ''; while (!feof($file_handle)) < $line_of_text = fgetcsv($file_handle, 1024); if ($id != $line_of_text[0]) < $new .= implode(',',$line_of_text) . PHP_EOL; >> 

в основном вы выполняете бросок каждой строки и проверяете, не совпадает ли идентификатор с идентификатором, отправленным в параметре get, если он не делает этого, он записывает строку в новый контейнер / переменную.

И затем перепишите $new значение в файл, это должно работать нормально:

Источник

Как удалить пустые строки в CSV файле PHP функцией?

В файле wb_posts.csv есть пустые строки, которые рушат скрипт:

507536,1,2022-10-23 00:00:00,2022-10-23 00:00:00,,"20 inch Voile Strap, Black - Musta",Väri: Musta,publish,closed,closed,,20-inch-voile-strap-black. 2022-10-23 01:00:00,2022-10-23 01:00:00,,502451,https://site.fi/?post_type=product_variation&p=507.

Как отформатировать php кодом весь csv файл так, чтобы было вот так?:

ID,post_author,post_date,post_date_gmt,post_content,post_title,post_excerpt,post_status,comment_status,ping_status,post_password,post_name,to_ping,pinged,post_modified,post_modified_gmt,post_content_filtered,post_parent,guid,menu_order,post_type,post_mime_type,comment_count
507536,1,2022-10-23 00:00:00,2022-10-23 00:00:00,,"20 inch Voile Strap, Black - Musta",Väri: Musta,publish,closed,closed,,20-inch-voile-strap-black. 2022-10-23 01:00:00,2022-10-23 01:00:00,,502451,https://site.fi/?post_type=product_variation&p=507.

Простой 3 комментария

v3shin

С помощью функции file() получаете строки файла, потом проходитесь по ним либо циклом, либо array_filter() и пишете все обратно в файл.
А потом переписываете скрипт, который формирует подобный csv чтобы не писал пустые строки. Или в скрипт, который его разбирает, добавляете проверку пустых строк.

Compolomus

$trimmed = file('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

осторожно, пустые строки в csv могут оказаться частью данных в строковых колонках, php fgetcsv корректно их обрабатывает а вот всякие упрощенные file и fgets . нет

правильно - написать приложение из 10 строчек типа такого:

$r=fopen('filename.csv','r'); $w=fopen('result.csv','w'); while(!feof($r)) < $row=fgetcsv($r,0,',','"'); // из-за 0 вторым параметром будет работать медленно, если знаешь максимальную длину строки в файле, пропиши ее тут с запасом if(empty($row)) continue; fputcsv($w,$row,',','"'); >fclose($w); fclose($r);

идеально - не пользоваться этим говноинструментом, на столько отвратительного способа передачи данных еще нужно поискать, сколько занимаюсь обработкой данных, столько натыкаюсь на постоянные ошибки тех кто экспортирует данные в csv. Ну есть же другие удобные инструменты, выдай дамп json (есть неплохой вариант - размещать записи построчно, одна строка один json объект), или одно время любили xml (у него тоже есть проблемы)

Абсолютно верный путь - передавать данные в базе данных sqlite, или пусть будет проприетарный майкрософтвский .mdb если это принципиально, главное чтобы не изобретали способы сериализации чисел строк дат, списков и прочего.

p.s. для тех кто не понял, \n внутри строк это часть стандарта

Источник

Оцените статью