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

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

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

Post by Ticketa »

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

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
Гуру
Гуру
Reactions: 0
Posts: 2833
Joined: Sat Sep 12, 2009 8:07 am
Answers: 111

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

Post by djman »

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

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

И защо добавяш html тагове преди обработката (nl2br)?
User avatar
Revelation
Web-tourist
Web-tourist
Reactions: 1
Posts: 958
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 68

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

Post by Revelation »

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

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

Ако знаеш, че файла ще е голям е най-добре да използваш даже генератори, за да предотвратиш използване на повече РАМ отколкото си заделил за PHP.
uphero
Потребител
Потребител
Reactions: 0
Posts: 799
Joined: Mon Feb 20, 2012 12:26 pm
Answers: 35
Location: Казанлък
Contact:

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

Post by uphero »

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
Reactions: 0
Posts: 3045
Joined: Sat Oct 01, 2005 4:33 pm
Answers: 204
Location: Шопландия
Contact:

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

Post by deam0n »

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

Code: Select all

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