как пропустить пустые строки с помощью fgetcsv

Я работаю над импортом файла csv в базу данных mysql. Проблема в том, что мой клиент уже получает файлы с неправильным форматированием. строки заканчиваются на 43, но файл опускается до 65078!!

При импорте скрипт занимает вечность. Что я могу сделать, чтобы импортировать только строки от 0 до 44? Вот код, который я использую.

  <table>
<?php
//fgetcsv($handle, 1024, delimiter)
$file = fopen("prices.csv", "r");
$row = 0;

    while($csv_line = fgetcsv($file,1024)) {

      if($row ==    4){
        echo "How many headers do we have: ".count($csv_line)."<tr>";

         foreach($csv_line as $header){

           if($header !== NULL){
            print "<td>$header</td>";
           }
         }
         echo "</tr>";
      } 

      if($row > 6) {

        echo '<tr>';

        for ($i = 0, $j = count($csv_line); $i < $j; $i++) {

          echo '<td>'.$csv_line[$i].'</td>';

        }

        echo "</tr>\n";

      } else {

        $row++;

      }

    } 
?>

</table>

person Chiko    schedule 16.08.2011    source источник


Ответы (2)


Если количество заполненных строк не фиксировано, вы можете использовать аналогичный подход с:

if (empty($line)) { break; }

Ваш комментарий дает мне идею для лучшего решения:

Здесь http://php.net/manual/en/function.fgetcsv.php появляется это «Пустая строка в файле CSV будет возвращена как массив, содержащий одно нулевое поле», так что, возможно, это поможет:

while(($csv_line = fgetcsv($file,1024)) && $csv_line[0]) {

Будет читать только до тех пор, пока не найдет пустую строку.

person leticia    schedule 16.08.2011
comment
Я думаю, что мог бы это сделать, но не будет ли файл по-прежнему анализироваться, и это все равно займет слишком много времени? потому что для php, чтобы знать, что строка пуста, она все равно дошла бы до конца файла... - person Chiko; 17.08.2011
comment
Ваш комментарий дал мне идею для лучшего решения: здесь ссылка появляется эта A пустая строка в файле CSV будет возвращена в виде массива, состоящего из одного пустого поля, поэтому, возможно, это поможет: while(($csv_line = fgetcsv($file,1024)) && $csv_line[0]) { Будет читать только до тех пор, пока не найдет пустую строку (я обновлю ответ) - person leticia; 18.08.2011
comment
@leticia У меня похожий вопрос: Ссылка - person Grischa; 12.07.2014
comment
ваш второй правильный? что, если первый элемент строки равен нулю, но есть и другие, не равные нулю? - person Kiss Koppány; 12.06.2015

Добавьте if ($row >= 44) { break; } внизу цикла, чтобы он вышел, как только вы достигнете строки 44.

person Marc B    schedule 16.08.2011
comment
Спасибо за помощь. Я изменил его как таковой, но он просто не перестанет выполняться! Скрипт возвращает страницу, заполненную большим количеством пробелов внизу... - person Chiko; 17.08.2011
comment
Не помещайте $row++ в одно из предложений if(). он будет увеличиваться только в том случае, если это конкретное предложение соответствует. он должен находиться на верхнем уровне цикла, чтобы он увеличивался независимо от того, что происходит внутри цикла. - person Marc B; 17.08.2011