2011-10-06 17 views
5

Sto provando a determinare quante colonne ha un file csv.PHP fgetcsv() - trova il numero di colonne

Ecco il mio script, che utilizza solo la prima colonna, ma sono leggermente cieco. Voglio posizionare una variabile che limiti il ​​numero di colonne. (Dal momento che io possa fare un errore e aggiungere una colonna, o anche perdere una colonna)

<?php 
$allowedColNum=5; 
$batchcount=0; 
$file = fopen($file_name, "r"); 
while ($line = fgetcsv($file)){ 
/* I want to stop the loop if the $allowedColNum is not correct */     
    $col = $line[0]; 
    echo $batchcount++.". ".$col."\n"; 
} 

fclose($file); 
?> 

Sono sicuro che è una di quelle cose facili facili che non sto ottenendo.

risposta

13

Se ho capito, è semplicemente necessario count($line), perché fgetcsv() ha restituito una matrice che rappresenta una riga dal file CSV. L'array count() è quindi il numero di colonne di origine.

while ($line = fgetcsv($file)){ 

    // count($line) is the number of columns 
    $numcols = count($line); 

    // Bail out of the loop if columns are incorrect 
    if ($numcols != $allowedColNum) { 
    break; 
    } 
    $col = $line[0]; 
    echo $batchcount++.". ".$col."\n"; 
} 
+0

vedo! Penso di essermi confuso nel trovare i $ numcols prima vs dopo aver ottenuto le singole righe. Immagino che non è così che funziona, dal momento che forse una riga specifica ha un numero di colonna diverso rispetto ad altri nello stesso file. Ma sto facendo un'ipotesi onestamente, visto che sono nuovo con i file. – coffeemonitor

0

Non testato, ma dovrebbe funzionare!

$allowedColNum=5; 
$batchcount=0; 
$file = fopen($file_name, "r"); 
$totCols=0; 
while ($line = fgetcsv($file)) 
if(count($line) > $totCols) $totCols = count($line); 
fseek($file, 0); 
while ($line = fgetcsv($file)) 
{ 
    //.... 
} 
fclose($file); 

edit: testato, lavorando fare fseek (0), invece di salvare i valori in un array: sarà molto più veloce

0

Michael Berkowski lavoro risposta bene per me, ma nel mio caso, i dovevo anche specificare il separatore csv nella chiamata alla funzione fgetcsv(). È la virgola "," per impostazione predefinita, lo cambio in punto e virgola ";". Come questo:

while ($ linea = fgetcsv ($ file, 0, ';')) {

Problemi correlati