2013-02-26 4 views
6

Sto cercando di esportare i dati esistenti da un database MySQL, in comandi ruby ​​che posso eseguire con rake db:seed.Aggiunta di un simbolo n newline quando si utilizza sprintf in PHP

Ecco il mio codice.

# Generate db:seed data for proveedores. 
$proveedores = R::findAll('tbproveedores'); 
$proveedoresE = R::exportAll($proveedores); 

foreach ($proveedoresE as &$p) { 

    $line = 'BookSupplier.create(company: "%s", city: "%s", country: "%s", address: "%s", telephone: "%s", contact: "%s", email: "%s", website: "%s"\n'; 
    $exportedLine = sprintf($line, $p['empresa'], $p['ciudad'], $p['pais'], $p['direccion'], $p['telefono'], $p['personacontacto'], $p['email'], $p['website']); 
    var_dump($exportedLine); 
    fwrite($seeds, $exportedLine); 
    echo "<br />"; 
} 

Avviso il ritorno a capo simbolo \n alla fine della variabile $ line. Ho letto online che era tutto ciò che è necessario per usare una nuova riga.

L'uscita del mio codice di cui sopra è (vertabim, una lunga fila):

BookSupplier.create(company: "Pearson", city: "Lima", country: "Peru", address: "Av. Limon", telephone: "4673535421", contact: "Javier", email: "", website: ""\nBookSupplier.create(company: "Project Management Institute - PMI", city: "Pennsylvania", country: "Estados Unidos", address: "Newtown Square, Pennsylvania", telephone: "1", contact: "Limberg Morales", email: "", website: "http://www.pmi.org/"\nBookSupplier.create(company: "UVirtual - Centro de Excelencia", city: "Santa Cruz", country: "Bolivia", address: "Av. Irala 585", telephone: "1", contact: "Limberg Morales", email: "", website: ""\nBookSupplier.create(company: "Ábaco de Rodolfo Depalma", city: "Buenos Aires", country: "Argentina", address: "Viamonte 1336, 4° (C1053 ACB) Buenos Aires", telephone: "5411-43711675", contact: "Limberg Morales", email: "", website: "http://www.abacoeditorial.com.ar/"\nBookSupplier.create(company: "Pablo Lledó - ProjectManagement", city: "Canadá", country: "Estados Unidos", address: "Victoria, BC, Canadá", telephone: "1", contact: "Limberg Morales", email: "", website: ""\n 

mi piacerebbe ogni chiamata ad essere in essa la propria linea, seguendo il mio inserimento di nuova riga. Qualche suggerimento su cosa sto facendo male?

risposta

22

Il simbolo di nuova riga \n verrà interpretato solo quando è racchiuso tra doppio preventivi: ". Come quella:

$line = '...............'; 
$line .= "\n"; 

Si dovrebbe anche sapere di PHP_EOL è una costante che contiene il delimitatore sistemi di nuova riga che è diverso su diversi sistemi operativi. Ad esempio sarà \n su Linux ma \r\n su Windows. Il codice più portatile sarà simile:

$line = '.....'; 
$line .= PHP_EOL; 
0
$line = "BookSupplier.create(company: '%s', city: '%s', country: '%s', address: '%s', telephone: '%s', contact: '%s', email: '%s', website: '%s'\n"; 

doppi apici sono obbligatori per \ n (o qualsiasi altro carattere whitescpace come \ t) per funzionare.

+1

La sintassi della stringa non è corretta (è visibile anche a causa dell'evidenziazione della sintassi di [so]). È necessario sfuggire alle virgolette * all'interno * della stringa. – Veger

+1

È stato veloce .. Lo ha modificato. Presumo che abbia usato le virgolette solo per delimitare i dati dei vars, quindi li ho trasformati in virgolette singole (sfuggire alle virgolette è un'altra possibilità). –

2

I caratteri speciali nelle stringhe funzionano solo quando è racchiuso tra virgolette ("). Vedere la PHP string documentation per ulteriori informazioni.

Quindi, o usare le virgolette, che è un sacco di lavoro come si usa un bel . poche virgolette doppie nella stringa come bene e fuggire tutti i doppi apici all'interno della stringa

Oppure, se siete pigri, concatenare la nuova linea di seguito:.

$line = '...'; 
$line .= "\n"; 
5

È necessario utilizzare corde doppie virgolette, singolo quelli citati non sono e xpand sequenze di caratteri speciali. Controlla the manual per ulteriori dettagli sulle stringhe PHP.

+0

Grazie per quello! – Jonathan

11

Se non è possibile (o non vogliono) interruttore per le doppie virgolette, è possibile inserire una nuova riga utilizzando il codice ASCII in questo modo:

> php 
<?php printf('line one%cline two', 10);^D 
line one 
line two 
> 

Il %c consente di inserire alcun codice ASCII e 10 è il codice per una nuova riga.

1

In seguito alla risposta di Josh, è possibile iniettare la nuova riga da una stringa interpolata in printf utilizzando% s printf('something%s', "\n") che inizia ad avere più senso in un esempio più complesso, ad es. se il modello di stringa è memorizzato in una variabile di lingua, o stai facendo più sostituzioni, oppure devi semplicemente rimanere con sprintf perché il tuo PHB lo richiede.

Nel tuo caso sarebbe

$line = 'BookSupplier.create(company: "%s", city: "%s", country: "%s", address: "%s", telephone: "%s", contact: "%s", email: "%s", website: "%s"%s'; 
$exportedLine = sprintf($line, $p['empresa'], $p['ciudad'], $p['pais'], $p['direccion'], $p['telefono'], $p['personacontacto'], $p['email'], $p['website'], "\n"); 

è stato formattato un blocco di intestazione e-mail così:

$headers = sprintf(
    'From: %1$s%2$sReply-To: %1$s%2$sMIME-Version: 1.0%2$sContent-type: text/html; charset=iso-8859-1%2$s' 
    , $EMAIL_FROM, "\r\n"); 

ripetendo l'uso del \r\n utilizzando la sintassi indice di 1$ parametro.

Quindidiventa il nuovo \r\n, non accetta alcun carattere in più ma è più difficile da leggere!