Làm cách nào để thoát khỏi dấu phẩy và dấu giọng nói trong tệp CSV để chúng hoạt động trong Excel?


110

Tôi đang tạo tệp CSV (được phân tách bằng dấu phẩy thay vì tab). Người dùng của tôi rất có thể sẽ mở tệp CSV trong Excel bằng cách nhấp đúp vào tệp đó. Dữ liệu của tôi có thể chứa dấu phẩy và dấu giọng nói, vì vậy tôi đang thoát những dữ liệu đó như sau.

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."

Theo như tôi biết thì đó luôn là cách để làm điều đó. Đây là lỗi của tôi: khi tôi mở tệp này trong Excel 2010, quá trình thoát của tôi không được tôn trọng. Dấu giọng nói xuất hiện trên trang tính và dấu phẩy tạo ra các cột mới.

Câu trả lời:


219

Cuối cùng chúng tôi đã tìm ra câu trả lời cho điều này.

Excel sẽ chỉ tôn trọng việc thoát dấu phẩy và dấu giọng nói nếu giá trị cột KHÔNG đứng trước khoảng trắng. Vì vậy, tạo tệp không có khoảng trắng như thế này ...

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."

... đã khắc phục sự cố. Hy vọng điều này sẽ giúp ai đó!


2
Đây là một vấn đề mà tôi đã gặp phải trước đây và tôi luôn quên nó. Excel nên ngừng hành vi này, vì nó chỉ đơn giản là tạo ra sự nhầm lẫn và không phải là một quy tắc hữu ích ngay từ đầu. Cái đó hoặc csv's bắt buộc không có khoảng trắng ở giữa các dấu phẩy.
Jacques Mathieu

61

Dưới đây là các quy tắc nếu bạn tin rằng đó là ngẫu nhiên. Một chức năng tiện ích có thể được tạo ra trên cơ sở các quy tắc này.

  1. Nếu giá trị chứa dấu phẩy, dòng mới hoặc dấu ngoặc kép, thì giá trị Chuỗi phải được trả về trong dấu ngoặc kép.

  2. Bất kỳ ký tự dấu ngoặc kép nào trong giá trị phải được thoát bằng một dấu ngoặc kép khác.

  3. Nếu giá trị không chứa dấu phẩy, dòng mới hoặc dấu ngoặc kép, thì giá trị Chuỗi sẽ được trả về không thay đổi.


4
Có hại gì không khi trích dẫn-bọc một thứ gì đó không có dấu phẩy, dấu ngoặc kép hoặc dòng mới?
Erik Reppen

2
Không ErikReppen Tôi không nghĩ điều đó sẽ gây tổn thương bình thường. Tôi thuộc về nền java, nơi nó được khuyến nghị không tạo chuỗi mới bằng cách thay thế văn bản bằng văn bản cũ vì chúng có phần riêng bên trong bộ nhớ heap. Nếu bạn muốn, bạn có thể thay thế vô điều kiện tất cả các giá trị và cho chúng tôi biết nếu nó gây ra bất kỳ vấn đề nào mặc dù không nên.
AlphaBetaGamma

2
Một trường bắt đầu hoặc kết thúc bằng dấu cách phải được trích dẫn.
Jonathan Rosenne

2

Theo hướng dẫn của Yashu, tôi đã viết hàm sau (đó là mã PL / SQL, nhưng nó phải dễ dàng thích ứng với bất kỳ ngôn ngữ nào khác).

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;

0

Dấu ngoặc đơn cũng hoạt động tốt, ngay cả khi không thoát khỏi dấu ngoặc kép, ít nhất là trong Excel 2016:

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

Excel sẽ đặt nó trong 5 cột (nếu bạn chọn một trích dẫn duy nhất là "Định nghĩa văn bản" trong trình hướng dẫn "Văn bản thành cột")


-3

Ngay cả sau khi dấu ngoặc kép, tôi đã gặp vấn đề này trong vài ngày.

Đã thay thế Dấu phân cách ống bằng Dấu phẩy, sau đó mọi thứ hoạt động tốt.


1
Bạn nên đưa ra một mẫu về những gì phù hợp với bạn để OP có thể sao chép và dán nó nếu cần.
Reuben Tanner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.