Я пытаюсь найти быстрый способ чтения из файла csv, сначала пропустив несколько строк, прочитав около 20 строк, а затем остановив чтение. единственное решение ryt теперь использует fread, что довольно неэффективно.PHP пропускает строки при чтении
ответ
Единственный способ прокрутки через CSV, уважающего конкретный формат CSV является вызвать парсер. Самый быстрый CSV-парсер построен в fgetcsv
. Таким образом, это будет самый быстрый из всех возможных надежных методов:
function csv_slice($fp, $offset = 0, $length = 0) {
$i = 0;
while (false !== ($row = fgetcsv($fp))) {
if ($i++ < $offset) continue;
if (0 < $length && $length <= ($i - $offset - 1)) break;
yield $row;
}
}
Используется как:
$fp = fopen('file.csv', 'r');
print_r(
iterator_to_array(
csv_slice($fp, 5, 2) // start after 5th row, return 2 rows
)
);
fclose($fp);
я использовал генераторы здесь, чтобы сохранить потребление памяти на низком уровне. Вы можете легко заменить временным массивом, если хотите.
Если вы можете сделать некоторые предположения о концах строк, вы можете просто читать байты по-байтам, пока не найдете диапазон строк. Но, честно говоря, я бы этого не сделал.
спасибо, ребята, особенно @bishop – Karuhanga
Попробуйте использовать file()
. Он будет читать все строки вашего файла, а затем вы можете прочитать его так, как хотите. Например:
$lines = file("myfile.txt");
$lineCounter = count($lines);
if($lineCounter > 20){
$startsAt = 21; //Skip 20 lines
for($i = $startsAt; $i < $lineCounter; $i++){
$line = $lines[$i];
//Do whatever you want with the line contents
}
}
Скажем, если у вас есть этот кусок кода ниже
<?php
$row = 1;
if (($handle = fopen("ptt.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
$row++;
for ($c=0; $c < $num; $c++) {
echo "<TR>"; // OPEN ROW
if(strpos($data[$c], 'Finished') !== false) {
$c++;
echo "<TD nowrap>" . $data[$c] . "</TD>";
}else{
echo "<TD nowrap>" . $data[$c] . "</TD>";
}
echo "</TR>"; // CLOSE ROW
}
}
fclose($handle);
}
?>
если добавить
if($row == 20){ $row++; continue; }
после цикла в то время как
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if($row == 20){ $row++; continue; }
сейчас, скажем, если вы хотите начать с строки 20, это будет c ontinue чтение
сделаем другой пример. если вы хотите, чтобы остановить чтение на линии 40, начиная с 1 вы можете вставить
if($row == 40){ $row++; exit; }
@ref: http://stackoverflow.com/questions/10901113/skip-the-first-line-of-a-csv-file – unixmiah
- 1. Почему BufferedReader пропускает некоторые строки при чтении PHP-файла?
- 2. станд :: GetLine не пропускает пустые строки при чтении из ifstream
- 3. fgetc пропускает байты при чтении файла
- 4. Скрипт пропускает второй цикл при чтении файла
- 5. xdebug пропускает строки при отладке
- 6. Python пропускает строки при печати
- 7. Excel Пропускает неправильный тип столбца при чтении в набор данных
- 8. PHPExcel пропускает строки Excel
- 9. BufferedReader пропускает случайные символы при чтении с USB
- 10. Java bufferedreader иногда пропускает первый символ при чтении строк
- 11. OutOfMemoryException при чтении строки Json
- 12. java.lang.IllegalArgumentException при чтении из строки
- 13. EOFError: EOF при чтении строки
- 14. Ошибка памяти при чтении строки
- 15. нить для строки строки; при чтении файла
- 16. При чтении файла, пытающегося определить действительные оценки, почему читатель файла пропускает строки?
- 17. Почему Eclipse пропускает строки при отладке JBoss?
- 18. Получение проблемы при чтении строки запроса в PHP
- 19. Обновление строки выполнения Jquery при чтении txt-файла (от php)
- 20. Удаление пустой строки при чтении файла docx в php
- 21. Пропустить пустые строки при чтении файла csv excel в php
- 22. php csv пропускает одну строку при отправке
- 23. Java пропускает строки кода
- 24. :: выбор пропускает некоторые строки
- 25. fgetcsv пропускает строки
- 26. Класс сканера пропускает строки
- 27. Программа пропускает строки кода
- 28. Блокировка уровня строки или блокировка при чтении
- 29. неисправностей Сегментация аргументы команды при чтении строки
- 30. Ошибка EOF Python при чтении строки
Почему бы не попробовать фуд? это то, что 'fgetcsv()' будет использовать внутренне в любом случае. так или иначе, эти строки должны быть прочитаны в php, чтобы понять, где разрыв строки. если вы решите пропустить/проигнорировать эти строки, это не проблема php - данные должны быть прочитаны. –
Вы можете прочитать весь файл в массив с 'file()', а затем использовать 'array_slice()', чтобы получить нужные строки. – Barmar
Но если файл большой, это будет медленнее и расточительно. Ваш первоначальный путь, вероятно, лучший. – Barmar