2013-02-26 14 views
6

Próbuję wyeksportować istniejące dane z bazy danych MySQL do komend ruby, które mogę uruchomić z rake db:seed.Dodawanie symbolu n nowej linii podczas używania sprintf w PHP

Oto mój kod.

# 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 />"; 
} 

Zwróć uwagę na nowy symbol linii \n na końcu zmiennej $ line. Czytałem w Internecie, że to wszystko, co jest potrzebne do korzystania z linii nowej linii.

Wyjście z mojego kodu powyżej (vertabim, długa linia):

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 

Chciałbym każde wywołanie być w jego własnej linii, po moim nowego wiersza wprowadzania. Wszelkie sugestie dotyczące tego, co robię źle?

Odpowiedz

22

Symbolem nowej linii \n będą interpretowane tylko wtedy, gdy jest zamknięty w podwójnych cytatów: ". Tak:

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

Warto również wiedzieć o PHP_EOL Jest to stała, która zawiera separator systemy nowej linii, która różni się w kilku systemach operacyjnych. Na przykład będzie to \n w systemie Linux, ale \r\n w systemie Windows. Najbardziej przenośny kod wyglądałby następująco:

$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"; 

Podwójne cudzysłowy są obowiązkowe dla \ n (lub jakiegokolwiek innego whitescpace char jak \ t) do pracy.

+1

Twoja składnia łańcuchów jest niepoprawna (jest widoczna nawet dzięki podświetleniu składni [so]). Musisz uciec od podwójnych cudzysłowów * wewnątrz * ciągu znaków. – Veger

+1

Był szybki. Zmieniono to. Przypuszczam, że użył cytatów tylko do zaznaczenia danych z vars, więc zmienił je na pojedyncze cudzysłowy (wyjście z podwójnych cudzysłowów jest kolejną możliwością). –

2

znaków specjalnych w ciągów działa tylko wtedy, gdy jest on ujęty w cudzysłów ("). Patrz PHP string documentation aby uzyskać więcej informacji.

Więc albo użyć cudzysłowia, która jest dużo pracy, jak użyć dość . kilka cudzysłowy w Twojej ciąg, jak również i uciec wszystkie cudzysłów wewnątrz łańcucha

Lub jeśli jesteś leniwy, złączyć nową linię później.

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

trzeba użyć podwójnej notowane ciągi, single cytowane nie mają e xpand specjalne sekwencje znaków. Sprawdź numer the manual, aby uzyskać więcej informacji na temat łańcuchów PHP.

+0

Dzięki za to! – Jonathan

11

Jeśli nie może (lub nie chcą) Przełącznik do cudzysłowach, można wstawić nową linię za pomocą kodu ASCII tak:

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

%c pozwala wstawić dowolny kod ASCII i 10 to kod nowej linii.

1

Po odpowiedzi Josh, można wprowadzić znak nowej linii z interpolowanego ciągu znaków do printf, używając% s printf('something%s', "\n"), który zaczyna mieć więcej sensu w bardziej złożonym przykładzie - np. jeśli szablon łańcucha jest przechowywany w zmiennej językowej, czy robisz wielokrotne zamienniki, lub po prostu musisz trzymać sprintf, ponieważ twój PHB to zleca.

W twoim przypadku byłoby

$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"); 

Mam sformatowany blok nagłówka e-mail tak:

$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"); 

powtarzając wykorzystanie \r\n używając składni indeksu 1$ parametru.

Tak więc %2$s staje się nowym \r\n, nie biorąc żadnych dodatkowych znaków, ale trudniej jest je odczytać!

Powiązane problemy