2014-01-30 1 views
15

Как я могу получить общее количество строк, которые находятся в файле CSV, используя PHP? Я использую этот метод, но могу заставить его работать правильно.Как я могу получить общее количество строк в CSV-файле с PHP?

if (($fp = fopen("test.csv", "r")) !== FALSE) { 
    while (($record = fgetcsv($fp)) !== FALSE) { 
     $row++; 
    } 

    echo $row; 
} 

ответ

38

Вот еще один вариант использования file() читать весь файл в массив, автоматически разборе новые строки и т.д.:

$fp = file('test.csv'); 
echo count($fp); 

Кроме того, поскольку PHP5, вы можете пройти в FILE_SKIP_EMPTY_LINES ... пропустить пустые строки, если вы хотите:

$fp = file('test.csv', FILE_SKIP_EMPTY_LINES); 

Руководство:http://php.net/manual/en/function.file.php

+10

Это работает для небольшого файла. Если у вас огромный CSV-файл (размер GB), использование файла() для чтения всего файла и count(), вероятно, является плохим, потому что он хранит файл в памяти и может повесить низкую систему памяти. –

+1

@TanHongTat есть более эффективный способ сделать это? –

+4

@ xd6_ [этот ответ] (http://stackoverflow.com/a/21447450/2812842) будет более эффективным для больших файлов –

3

Строки CSV разделены разрывами строк. Поэтому разделите строки на разрывы строк, и вы получите массив строк, который является счетным.

if (($fp = fopen("test.csv", "r")) !== FALSE) { 
    $rows = explode("\n", $fp); 
    $length = count($rows); 

    echo $length; 
} 
+4

Вы на самом деле не читаете указатель файла. И если вы просто подсчитываете строки, то 'count (file (" test.csv ")) будет быстрее. Однако в некоторых вариантах CSV цитируемые значения могут заключать в себе строки. – mario

12

Попробуйте

$c =0; 
$fp = fopen("test.csv","r"); 
if($fp){ 
    while(!feof($fp)){ 
      $content = fgets($fp); 
     if($content) $c++; 
    } 
} 
fclose($fp); 
echo $c; 
5

Я знаю, что это довольно старая, но на самом деле я столкнулся с тем же вопросом. В качестве решения я предполагаю использовать линукс специфическую логику:

$rows = shell_exec('$(/bin/which cat) file.csv | $(/bin/which tr) "\r" "\n" | $(which wc) -l'); 

Примечание: это работает только для только Linux, и это должно быть использовано только если вы 100% уверены, что файл не имеет многострочный-клетки

0

Я знаю, что это старый пост, но я был прибегая к помощи этому вопросу, и обнаружил, что единственная проблема с оригинальным кодом, что вам нужно определить $row вне цикла в то время как, как это:

if (($fp = fopen("test.csv", "r")) !== FALSE) { 
$row = 1; 
    while (($record = fgetcsv($fp)) !== FALSE) { 
     $row++; 
    } 

На всякий случай это помогает кому-то :) echo $ row; }

11

Создать новую ссылку на файл с помощью SplFileObject:

$file = new SplFileObject('test.csv', 'r'); 

Попробуйте seek до самого высокого Int PHP может работать:

$file->seek(PHP_INT_MAX); 

Тогда на самом деле он будет стремиться к самой высокой линии она могла в файле есть последняя строка, а последняя строка + 1 равна вашим общим линиям:

echo $file->key() + 1; 

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

+2

Блестящий, отлично работает, это должен быть главный ответ. – JeopardyTempest

+1

Работает с PHP> = 5.1 - и эффективен с точки зрения памяти. Используйте '$ file-> rewind()' для возврата к началу файла. –

-2

В случае, если вы получаете файл из формы

$file = $_FILES['csv']['tmp_name']; 
       $fp = new SplFileObject($file, 'r'); 
       $fp->seek(PHP_INT_MAX); 
       echo $fp->key() + 1; 
       $fp->rewind(); 

Работает как шарм !!!!!!!!!!!!!!!!!!

0
$filename=$_FILES['sel_file']['tmp_name']; 
$file=fopen($filename,"r"); 
$RowCount=0; 

while ((fgetcsv($file)) !== FALSE) 
{ 
    $RowCount++; 
} 

echo $RowCount; 
fclose($file); 
+0

Добавьте некоторое объяснение с ответом на вопрос, как этот ответ помогает OP в устранении текущей проблемы –

-1

кол-во (файл ('filename.csv ", FILE_SKIP_EMPTY_LINES));

Смежные вопросы