Jak uniknąć przecinków i znaków mowy w plikach CSV, aby działały w programie Excel?

111

Generuję plik CSV (rozdzielany przecinkami, a nie tabulatorami). Moi użytkownicy najprawdopodobniej otworzą plik CSV w programie Excel, klikając go dwukrotnie. Moje dane mogą zawierać przecinki i znaki mowy, więc unikam ich w następujący sposób.

Reference, Title, Description
1, "My little title", "My description, which may contain ""speech marks"" and commas."
2, "My other little title", "My other description, which may also contain ""speech marks"" and commas."

O ile wiem, zawsze tak było. Oto mój problem: kiedy otwieram ten plik w programie Excel 2010, moja ucieczka nie jest przestrzegana. Znaki mowy pojawiają się na arkuszu, a przecinek tworzy nowe kolumny.

centralscru
źródło

Odpowiedzi:

219

W końcu znaleźliśmy odpowiedź na to pytanie.

Program Excel będzie uwzględniał zmiany znaczenia przecinków i znaków mowy tylko wtedy, gdy wartość kolumny NIE jest poprzedzona spacją. Generowanie pliku bez spacji w ten sposób ...

Reference,Title,Description
1,"My little title","My description, which may contain ""speech marks"" and commas."
2,"My other little title","My other description, which may also contain ""speech marks"" and commas."

... rozwiązałem problem. Mam nadzieję, że to komuś pomoże!

centralscru
źródło
2
To jest problem, z którym miałem do czynienia wcześniej i zawsze o nim zapominam. Excel powinien zaprzestać tego zachowania, ponieważ po prostu powoduje to zamieszanie i nie jest przydatną zasadą. To lub csv powinny mieć obowiązkowe brak spacji między przecinkami.
Jacques Mathieu
61

Poniżej znajdują się zasady, jeśli uważasz, że jest to przypadkowe. Na podstawie tych reguł można stworzyć funkcję użyteczności.

  1. Jeśli wartość zawiera przecinek, znak nowej linii lub podwójny cudzysłów, wartość typu String powinna zostać zwrócona w cudzysłowie.

  2. Wszelkie znaki podwójnego cudzysłowu w wartości powinny być poprzedzone innym cudzysłowem.

  3. Jeśli wartość nie zawiera przecinka, nowej linii ani podwójnego cudzysłowu, wówczas wartość String powinna zostać zwrócona bez zmian.

AlphaBetaGamma
źródło
4
Czy zawijanie w cudzysłów czegoś, co nie ma przecinków, cudzysłowów ani nowych linii, boli?
Erik Reppen
2
Nie ErikReppen. Nie sądzę, żeby to bolało normalnie. Należę do tła Java, w którym nie zaleca się tworzenia nowych ciągów przez zastępowanie tekstu w starym, ponieważ mają one swój udział w pamięci sterty. Jeśli chcesz, możesz bezwarunkowo zastąpić wszystkie wartości i powiedzieć nam, czy powoduje to jakiś problem, chociaż nie powinien.
AlphaBetaGamma
2
Pole, które zaczyna się lub kończy spacją, powinno być cytowane.
Jonathan Rosenne
2

Zgodnie z instrukcjami Yashu napisałem następującą funkcję (to kod PL / SQL, ale powinien być łatwy do dostosowania do dowolnego innego języka).

FUNCTION field(str IN VARCHAR2) RETURN VARCHAR2 IS
    C_NEWLINE CONSTANT CHAR(1) := '
'; -- newline is intentional

    v_aux VARCHAR2(32000);
    v_has_double_quotes BOOLEAN;
    v_has_comma BOOLEAN;
    v_has_newline BOOLEAN;
BEGIN
    v_has_double_quotes := instr(str, '"') > 0;
    v_has_comma := instr(str,',') > 0;
    v_has_newline := instr(str, C_NEWLINE) > 0;

    IF v_has_double_quotes OR v_has_comma OR v_has_newline THEN
        IF v_has_double_quotes THEN
            v_aux := replace(str,'"','""');
        ELSE
            v_aux := str;
        END IF;
        return '"'||v_aux||'"';
    ELSE
        return str;
    END IF;
END;
aaguilera
źródło
0

Pojedyncze cudzysłowy też działają dobrze, nawet bez znaków unikania podwójnych cudzysłowów, przynajmniej w Excel 2016:

'text with spaces, and a comma','more text with spaces','spaces and "quoted text" and more spaces','nospaces','NOSPACES1234'

Excel umieści to w 5 kolumnach (jeśli wybierzesz pojedynczy cudzysłów jako „Kwalifikator tekstu” w kreatorze „Tekst do kolumn”)

golimar
źródło
-3

Nawet po podwójnych cudzysłowach miałem ten problem przez kilka dni.

Zastąpiono ogranicznik rur przecinkiem, a potem wszystko działało dobrze.

Ramkumar Navaneethakrishnan
źródło
1
Powinieneś podać próbkę tego, co zadziałało, aby OP mógł ją skopiować i wkleić w razie potrzeby.
Reuben Tanner