2012-08-15 19 views
35

voglio fare qualcosa di simile:linea di lettura per riga da STDIN

$ [mysql query that produces many lines] | php parse_STDIN.php 

In parse_STDIN.php lima voglio essere in grado di analizzare la mia linea di dati per riga da stdin.

+0

Hai provato a chiamare quella query dallo script PHP? Conosci mysqli_query ("SELECT' many_lines' FROM 'big_table'") ;? In questo modo, non devi passare argomenti o altro. PHP è un linguaggio di script usato per i server web. Se si desidera una soluzione di elaborazione reale, utilizzare un linguaggio di programmazione come C. – ATaylor

+0

Innanzitutto: perché? Perché non eseguire la query solo nello script PHP? Secondo: 'while (! Feof (STDIN)) {$ line = fgets (STDIN); do_stuff ($ line); } ' – DaveRandom

+0

Dovresti conoscere la sezione * Uso della riga di comando * nel manuale PHP: [Input/output streams] (http://php.net/manual/features.commandline.io-streams.php) – hakre

risposta

69

utilizzare STDIN costante come gestore file.

while($f = fgets(STDIN)){ 
    echo "line: $f"; 
} 

Nota: fgets su STDIN legge il carattere \n.

+0

Ottimo! è più semplice di quanto pensassi. Grazie – sobi3ch

+1

"accetta"? cosa intendi. Dovrebbe esserci il pulsante [accetta] o cosa? Scusa se non sto usando lo stackoverflow molto spesso, quindi forse mi manca qualcosa. – sobi3ch

+0

ok ho trovato, grazie – sobi3ch

13

È anche possibile utilizzare un generatore, se non si sa quanto grande sarà lo STDIN.

richiede PHP 5> = 5.5.0, PHP 7

Qualcosa sulla falsariga di:

function stdin_stream() 
{ 
    while ($line = fgets(STDIN)) { 
     yield $line; 
    } 
} 

foreach (stdin_stream() as $line) { 
    // do something with the contents coming in from STDIN 
} 

Si può leggere di più su generatori qui (o una ricerca su Google per tutorial): http://php.net/manual/en/language.generators.overview.php

+0

e se una riga in STDIN fosse vuota o' "0" '? – luchaninov

+2

Poiché 'fgets()' mantiene la fine riga alla fine ("\ n"), ciò non accadrà fino a EOF. – MatsLindh

Problemi correlati