Как мога да филтрирам и изтрия ненужни редове?

C++ JAVA
Post Reply
User avatar
Ticketa
Потребител
Потребител
Posts: 615
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 24
Location: in /root
Contact:

Как мога да филтрирам и изтрия ненужни редове?

Post by Ticketa » Fri Apr 02, 2021 11:35 am

Привет,
Имам следния формат на текстове:

1234567890, asd, asd, 1234567890
123456, asd, gfd, 1234567890
6754342, asd, gdg, 1234567890
123456789, grkgg, dsfdsfds, 1234567890
175645454, fggfd, rfgggffdgdggf, 1234567890

Данните всичките са на нов ред. Искам да проверя първия стринг дали отговаря на дължина от - до 9 символа и когато пуска кода, да се изтрива всичко не нужно. В случая горния пример да стане:

123456789, grkgg, dsfdsfds, 1234567890
175645454, fggfd, rfgggffdgdggf, 1234567890

Предполагам, че само с preg_match и preg_replace, ще стане, но за момента не успях

Пробвах и така:

Code: Select all

<?php
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);

$string="
1234567890, asd, asd
123456, asd, gfd
6754342, asd, gdg
123456789, grkgg, dsfdsfds
175645454, fggfd, rfgggffdgdggf";
$string = nl2br($string);
echo $string;
echo "<hr/>";
$rows = explode("\n",$string);
$unwanted = "\d{10},";
$cleanArray= preg_grep("/$unwanted/i",$rows,PREG_GREP_INVERT);
$cleanString=implode("\n",$cleanArray);
print_r ( $cleanString );
И ми върши работа, но това правилен ли начин е? Така изтривам само цифрите с над 10 знака. И............не проверявам само първия стринг, ами целия текст, което е пречка, защото след първия стринг, също мога да имам 10 символа и трябва да си останат.

User avatar
djman
Гуру
Гуру
Posts: 2823
Joined: Sat Sep 12, 2009 8:07 am
Answers: 110

Re: Как мога да филтрирам и изтрия ненужни редове?

Post by djman » Fri Apr 02, 2021 3:23 pm

За самия регекс виж например https://regex101.com/r/MZK9zZ/1
"^" в началото означава, че търсиш от началото на стринга, а не в целия. (стринг = line, след като си разделил текста по \n)
Говориш за знаци, но в твоя регекс проверяваш само за цифри - това също е важно.

А за това дали е правилно - зависи колко е голям файла и дали имаш ограничения по памет...

И защо добавяш html тагове преди обработката (nl2br)?

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 943
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 66

Re: Как мога да филтрирам и изтрия ненужни редове?

Post by Revelation » Fri Apr 02, 2021 3:50 pm

Аз не бих използвал регулярни изрази за обработка на структуриран файл, особено ако файла се очаква да е голям.

Знаеш, че файла ти е разделен със запетаи и (очевидно) ще искаш да провериш само първия сегмент, така че те съветвам да си изчетеш файла като нормалните хора ред по ред и да го обработиш.

Ако знаеш, че файла ще е голям е най-добре да използваш даже генератори, за да предотвратиш използване на повече РАМ отколкото си заделил за PHP.

uphero
Потребител
Потребител
Posts: 795
Joined: Mon Feb 20, 2012 12:26 pm
Answers: 35
Location: Казанлък
Contact:

Re: Как мога да филтрирам и изтрия ненужни редове?

Post by uphero » Sat Apr 03, 2021 8:41 am

Code: Select all

<?php
$csv = '1234567890, asd, asd, 1234567890
123456, asd, gfd, 1234567890
6754342, asd, gdg, 1234567890
123456789, grkgg, dsfdsfds, 1234567890
175645454, fggfd, rfgggffdgdggf, 1234567890';

$rows = explode("\n", $csv);
$new  = '';

foreach ($rows as $key => $row) {
  $cell = strtok($row, ',');
  if (strlen($cell) == 9) {
    $new .= $row;
  }
}

echo "<hr>";
echo nl2br($csv);
echo "<hr>";
echo nl2br($new);
от това по просто не се сещам

User avatar
deam0n
Web-tourist
Web-tourist
Posts: 3044
Joined: Sat Oct 01, 2005 4:33 pm
Answers: 204
Location: Шопландия
Contact:

Re: Как мога да филтрирам и изтрия ненужни редове?

Post by deam0n » Tue Apr 06, 2021 1:50 pm

Попринцп може и директно така, ако си сигурен, че структурата на редовете ти винаги е такава :D

Code: Select all

 
 if ($row[9] == ',') {
    $new .= $row;
  }
  

Post Reply