2014-01-30 5 views

Antwort

38

Hier ist eine andere Option file() mit der gesamten Datei in ein Array zu lesen, automatisch parsen neue Linien etc:

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

Da auch PHP5, können Sie in der FILE_SKIP_EMPTY_LINES passieren ... überspringen wenn Sie leere Zeilen, möchten:

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

Handbuch:http://php.net/manual/en/function.file.php

+10

Dies funktioniert für kleine Dateien. Wenn Sie eine große CSV-Datei (GB Größe) haben, Datei(), um die gesamte Datei zu lesen und zählen() ist wahrscheinlich eine schlechte Idee, weil es die Datei im Speicher speichert, und kann ein niedriges Speichersystem hängen. –

+1

@TanHongTat gibt es eine effizientere Möglichkeit, dies zu tun? –

+4

@ xd6_ [diese Antwort] (http://stackoverflow.com/a/21447450/2812842) würde für große Dateien effizienter sein –

3

CSV-Zeilen sind durch Zeilenumbrüche getrennt. Daher teilen Sie die Zeilen nach Zeilenumbrüchen, und Sie erhalten ein Array von Zeilen, die zählbar ist.

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

    echo $length; 
} 
+4

Du liest nicht tatsächlich aus dem Dateizeiger. Und wenn Sie nur Zeilen zählen, dann würde 'count (file (" test.csv "))' es schneller erreichen. In einigen CSV-Varianten können die angegebenen Werte jedoch Zeilenumbrüche enthalten. – mario

12

Versuchen

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

Ich weiß, dass dies ziemlich alt, aber eigentlich lief ich in die gleiche Frage. Als Lösung würde ich annehmen, Linux spezifische Logik zu verwenden:

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

Hinweis: das funktioniert nur für Linux nur und dies sollte nur verwendet werden, wenn Sie 100% sicher sind, dass Ihre Datei keine mehrzeilige-Zellen hat

0

ich weiß, dass dies eine alte Post, aber ich habe dieses Problem wurde googeln und fand, dass das einzige Problem, mit dem ursprünglichen Code war, dass Sie $row außerhalb der while-Schleife, wie diese definieren müssen:

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

Nur für den Fall, dass es jemand hilft :) echo $ row; }

11

Erstellen Sie eine neue Datei Referenz verwendet SplFileObject:

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

zum höchsten Int PHP seek Versuchen umgehen kann:

$file->seek(PHP_INT_MAX); 

Dann tatsächlich wird es es könnte auf die höchste Linie suchen In der Datei befindet sich Ihre letzte Zeile und die letzte Zeile + 1 entspricht Ihren gesamten Zeilen:

echo $file->key() + 1; 

Tricky, aber das wird man aus dem Laden der Dateiinhalt in den Speicher vermeiden, was eine sehr coole Sache zu tun ist, wenn es mit wirklich großen Dateien.

+2

Brilliant, funktioniert gut, das sollte die beste Antwort sein. – JeopardyTempest

+1

Funktioniert mit PHP> = 5.1 - und ist speichereffizient. Verwenden Sie '$ file-> rewind()', um zum Anfang der Datei zurückzukehren. –

-2

Falls Sie die Datei aus einem Formular bekommen

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

Arbeiten wie Charme !!!!!!!!!!!!!!!!!!

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

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

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

Fügen Sie eine Erklärung mit der Antwort hinzu, wie diese Antwort dem aktuellen Problem helfen kann –

-1

Anzahl (Datei ('Dateiname.csv', FILE_SKIP_EMPTY_LINES));

Verwandte Themen