Đúng cách thoát một trích dẫn kép trong CSV


164

Tôi có một dòng như thế này trong CSV của mình:

"Samsung U600 24"","10000003409","1","10000003427"

Trích dẫn bên cạnh 24được sử dụng để thể hiện inch, trong khi trích dẫn ngay bên cạnh trích dẫn đó đóng cửa trường. Tôi đang đọc dòng với fgetcsvnhưng trình phân tích cú pháp mắc lỗi và đọc giá trị là:

Samsung U600 24",10000003409"

Tôi đã thử đặt dấu gạch chéo ngược trước dấu ngoặc kép, nhưng sau đó tôi chỉ nhận được dấu gạch chéo ngược trong tên:

Samsung U600 24\"

Có cách nào để thoát chính xác điều này trong CSV, để giá trị sẽ là Samsung U600 24", hoặc tôi phải regex nó trong bộ xử lý?


21
Chỉ cần tăng gấp đôi trích dẫn của bạn. Đó là tất cả
Ý thức chung của bạn

Câu trả lời:


281

Sử dụng 2 dấu ngoặc kép:

"Samsung U600 24"""

101
RFC-4180, đoạn "Nếu trích dẫn kép được sử dụng để bao quanh các trường, thì một trích dẫn kép xuất hiện bên trong một trường phải được thoát bằng cách đặt trước nó bằng một trích dẫn kép khác."
tham gia

4
Như tommed nói rằng bạn chỉ cần thêm một trích dẫn kép để thoát khỏi trích dẫn kép. Bạn có thể sử dụng công cụ dòng lệnh có tên csvfix để phát hiện bất kỳ dòng nào không tuân thủ: csvfix check -nl -v [tên tệp]
Sam Critchley

2
@SamCritchley Tôi chỉ thấy một trích dẫn kép duy nhất được sử dụng để trốn thoát ở đây. Bằng "Sử dụng 2 trích dẫn", user4035 có nghĩa là 1 trích dẫn nên được thay thế bằng 2 dấu ngoặc kép. Bằng cách thoát dấu ngoặc kép bằng dấu ngoặc kép, bạn đang tạo hiệu quả các cặp dấu ngoặc kép (2 dấu ngoặc kép). Báo giá cuối cùng bạn nhìn thấy ở cuối là chấm dứt trường.
Zenexer

1
một đôi báo giá đôi đơn được yêu cầu, nhưng chỉ khi được tiến hành bởi một trích dẫn đôi đơn ... may mắn nhất!
Daniel Waltrip

14

Không chỉ trích dẫn kép, bạn sẽ cần một trích dẫn đơn ( '), trích dẫn kép ( "), dấu gạch chéo ngược ( \) và NUL (byte NULL).

Sử dụng fputcsv()để viết, và fgetcsv()để đọc, sẽ chăm sóc tất cả.


3
Nhận xét này trên trang tài liệufputcsv() cho thấy cách bạn có thể sử dụng fputcsv()khi bạn muốn xuất định dạng csv sang trình duyệt thay vì tệp thực tế.
dennisschagt

15
@Angelin Nadar, bạn có thể vui lòng thêm một nguồn vào khiếu nại của mình về nhu cầu nhân đôi trích dẫn, dấu gạch chéo ngược và NUL không? Tôi đã không tìm thấy nó trong RFC-4180 .
Petr 'PePa' Pavel

2
Bạn không cần phải thực sự thoát các dấu ngoặc đơn, v.v. Một tệp CSV thích hợp thậm chí không cần thêm dấu ngoặc kép xung quanh một trường chỉ chứa các dấu ngoặc đơn. Nếu trình đọc CSV được triển khai đúng cách, nó sẽ đọc tệp chính xác ngay cả với các ký hiệu đó.
xji

4
Tại sao câu trả lời này đã được bỏ phiếu? Nhận xét về các ký tự thoát không bao giờ được sao lưu và câu hỏi ban đầu không hỏi về PHP. Điều này dường như chỉ đúng với dấu phân cách chuỗi (và chỉ cho dấu phân cách đã chọn) khi một chương trình, như Open Office, cho phép bạn thay đổi nó.
Dave F

0

Tôi biết đây là một bài viết cũ, nhưng đây là cách tôi đã giải quyết nó (cùng với việc chuyển đổi giá trị null thành chuỗi rỗng) trong C # bằng phương thức mở rộng.

Tạo một lớp tĩnh với một cái gì đó như sau:

    /// <summary>
    /// Wraps value in quotes if necessary and converts nulls to empty string
    /// </summary>
    /// <param name="value"></param>
    /// <returns>String ready for use in CSV output</returns>
    public static string Q(this string value)
    {
        if (value == null)
        {
            return string.Empty;
        }
        if (value.Contains(",") || (value.Contains("\"") || value.Contains("'") || value.Contains("\\"))
        {
            return "\"" + value + "\"";
        }
        return value;
    }

Sau đó, cho mỗi chuỗi bạn đang viết vào CSV, thay vì:

stringBuilder.Append( WhateverVariable );

Bạn chỉ cần làm:

stringBuilder.Append( WhateverVariable.Q() );

-1

Nếu một giá trị chứa dấu phẩy, ký tự dòng mới hoặc dấu ngoặc kép, thì chuỗi phải được đặt trong dấu ngoặc kép. Ví dụ: "char dòng mới trong lĩnh vực này \ n".

Bạn có thể sử dụng công cụ trực tuyến dưới đây để thoát "" và, toán tử. https://www.freeformatter.com/csv-escape.html#ad-output

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.