2012-10-31 6 views
6

Mam zgłoszenie do mojej bazy danych na stronie internetowej, która działa poprawnie. Ale kiedy generuję plik CSV (za pośrednictwem PHP) z mojej bazy danych, wszystkie podziały linii będą zepsuć wynikowy plik CSV. Każdy czytnik CSV interpretuje podział wiersza z danych wejściowych w nowej linii.Jak mogę usunąć wszystkie podziały wierszy, aby wygenerować prawidłowy plik CSV?

Próbowałem następujące metody:

  1. Encapsulating pól w cudzysłowach.

  2. to:

    $field = str_replace(array('\n', '\r', '\r\n', '\n\r'), ',', $original_field); 
    
  3. Również w tym:

    $field = strip_tags(nl2br($original_field)); 
    
  4. Łącząc wszystkie podejścia powyżej.

W każdym razie końcowym rezultatem będzie nadal popsuty plik CSV, który ulegnie przerwaniu w przypadku każdej przerwy w linii wprowadzonej przez użytkownika. Udało mi się zablokować nowe podziały wierszy w obszarze tekstowym, ale istnieje wiele starszych zgłoszeń, które wymagają mi poprawienia tego również po stronie CSV.

Dlaczego to nie działa? Jak mogę rozwiązać ten problem?

+0

Jak się tworzenie CSV? –

+0

Czy Twoje wpisy w bazie danych są już w formacie CSV? –

+0

Nie. Generuję za pomocą fwrite. Ale po przeczytaniu odpowiedzi mogę ponownie przemyśleć i wygenerować za pomocą putcsv. –

Odpowiedz

10

Przed Akceptowane odpowiedź (z użytkownikiem user1517891) nie jest poprawna, zastąpi ona w ciąg dwa razy, gdy istnieje \r\n ... Zastąpi go jako dwa przecinki ,. Najpierw zastąpi on: \r =>,, następnie \n =>,.

trzeba użyć go w innej kolejności, jak:

$field = str_replace(array("\r\n", "\n\r", "\n", "\r"), ',', $original_field); 
2

Musisz umieścić \n i podobne tagi w podwójnych cudzysłowach, w przeciwnym razie będą traktowane jako proste ciągi, a nie jako łamacze linii.

7

użyć cudzysłowów:

$field = str_replace(array("\n", "\r", "\r\n", "\n\r"), ',', $original_field); 
+2

To nie jest poprawne. – Legionar

1

Jeśli używasz fputcsv() ten problem nie powinien w ogóle istnieją:

fputcsv($f, array($field1, $field2, $field3)); 

domyślnie używa przecinka jako separatora i cudzysłowy jako obudowy strun.

+0

Też tak pomyślałem, ale on nie sprecyzował zbyt wiele na temat wyników; nazywa go CSV, ale nie wiemy nic, jak jest przetwarzany z wejścia. Biorąc pod uwagę przecinek, którego użył w ciągu zastępującym w swoim kodzie, wydaje się, że dane wejściowe użytkownika powinny już być linią w formacie CSV? Co oznaczałoby, że 'fputcsv()' nie jest rozwiązaniem jego bezpośredniego problemu. Czytanie między wierszami wydaje się prawdopodobne, że jego kod mógłby zostać uproszczony za pomocą 'fputcsv()', ale prawdopodobnie byłby to całkiem znacząca zmiana w sposobie, w jaki teraz robi. – SDC

2

Proponuję użyć do tego celu preg_replace() zamiast str_replace(). Powodem jest to, że może istnieć wiele linii nowej linii i kombinacji \r i, i przypuszczam, że chcesz zastąpić je wszystkimi pojedynczym przecinkiem.

Proponuję również użyć trim() do usunięcia końcowych pustych linii.

$field = preg_replace('/[\n\r]+/', ',', trim($original_field)); 
Powiązane problemy