Có cách nào để đưa dấu phẩy vào các cột CSV mà không phá vỡ định dạng không?


282

Tôi đã có một CSV hai cột với tên và số. Tên của một số người sử dụng dấu phẩy, ví dụ Joe Blow, CFA.Dấu phẩy này phá vỡ định dạng CSV, vì nó được hiểu là một cột mới.

Tôi đã đọc và đơn thuốc phổ biến nhất dường như đang thay thế ký tự đó hoặc thay thế dấu phân cách bằng một giá trị mới (ví dụ this|that|the, other).

Tôi thực sự muốn giữ dấu phân cách dấu phẩy (Tôi biết excel hỗ trợ các dấu phân cách khác nhưng các thông dịch viên khác có thể không). Tôi cũng muốn giữ dấu phẩy trong tên, vì Joe Blow| CFAtrông khá ngớ ngẩn.

Có cách nào để bao gồm dấu phẩy trong các cột CSV mà không phá vỡ định dạng, ví dụ bằng cách thoát chúng không?



Một chút hack đã làm việc cho tôi: mở tệp csv trong trình soạn thảo văn bản, sau đó dán vào tài liệu excel. Hoạt động nếu bạn có thể làm điều này trong khối lớn.
Jonas

@Jonas: Excel không thể đoán, cho dù cùng một mã thông báo được sử dụng làm dấu phân cách hoặc một phần của dữ liệu. Dán từ một trình soạn thảo văn bản không thay đổi điều đó.
IInspectable

Câu trả lời:


370

Bao gồm các lĩnh vực trong dấu ngoặc kép, ví dụ

field1_value,field2_value,"field 3,value",field4, etc...

Xem wikipedia .

Cập nhật :

Để mã hóa một trích dẫn, sử dụng ", một biểu tượng trích dẫn kép trong một trường sẽ được mã hóa thành ""và toàn bộ trường sẽ trở thành """". Vì vậy, nếu bạn thấy sau đây trong ví dụ Excel:

---------------------------------------
| regular_value |,,,"|  ,"", |"""   |"|
---------------------------------------

tệp CSV sẽ chứa:

regular_value,",,,""",","""",","""""""",""""

Dấu phẩy chỉ đơn giản được gói gọn bằng dấu ngoặc kép, vì vậy ,trở thành ",".

Dấu phẩy và trích dẫn cần được gói gọn và trích dẫn, vì vậy ","trở thành """,""".


4
Điều này làm việc cho tôi! Tôi đã xuất một biến js sang CSV và đặt thêm một cặp trích dẫn xung quanh mỗi chuỗi, giúp giải quyết vấn đề "John Blow, CFA", như đã đề cập trong câu hỏi.
Madhulika Mukherjee

Điều gì nếu có cả dấu ngoặc kép và dấu phẩy bên trong mỗi ô?
bay tốc độ

2
Tôi đã cập nhật câu trả lời với một số ví dụ - tóm lại, dấu phẩy được gói gọn trong dấu ngoặc kép (chẳng hạn như ",") và dấu ngoặc kép được thoát (ví dụ """)
Ryan

6
Bây giờ NÀY nên là câu trả lời được chấp nhận vì nó đề xuất một giải pháp tuyệt vời có khả năng giải quyết 99% các trường hợp sử dụng.
BuZz

Có thư viện C # để phân tích các tệp csv với các trường thoát trích dẫn không?
Minh Trần

34

Vấn đề với định dạng CSV, không có một thông số kỹ thuật, có một số phương thức được chấp nhận, không có cách nào để phân biệt nên sử dụng (để tạo / giải thích). Tôi đã thảo luận tất cả các phương pháp để thoát các ký tự (dòng mới trong trường hợp đó, nhưng cùng một tiền đề cơ bản) trong một bài viết khác . Về cơ bản, nó sử dụng quy trình tạo / thoát CSV cho người dùng dự định và hy vọng những người còn lại không bận tâm.

Tài liệu tham khảo thông số kỹ thuật .


10
RFC 4180, Định dạng chung và Loại MIME cho các tệp Giá trị phân tách bằng dấu phẩy (CSV), ietf.org/rfc/rfc4180.txt ; một đặc điểm kỹ thuật 'chính thức' nữa.
Shi

3
Bao gồm cách tiếp cận được chấp nhận rộng rãi nhất sẽ làm cho điều này trở thành một câu trả lời tuyệt vời. Khi nó đứng, câu trả lời của @Ryan thắng.
rinogo

16

Nếu bạn muốn làm cho bạn nói, bạn có thể sử dụng dấu ngoặc kép. Một cái gì đó như thế này

$name = "Joe Blow, CFA.";
$arr[] = "\"".$name."\"";

vì vậy bây giờ, bạn có thể sử dụng dấu phẩy trong biến tên của bạn.


Cảm ơn Cloud vì mũi của bạn, điều đó đã làm nó: $whatever = "\"".$name."\"";
washere

Cảm ơn bạn giải pháp.
Bhavin Thummar

10

Bạn cần trích dẫn các giá trị đó.
Dưới đây là một thông số kỹ thuật chi tiết hơn.


2
Có nhiều thông số kỹ thuật, Excel sử dụng dấu ngoặc kép quanh mục, Linux sử dụng ký tự dấu gạch chéo ngược. Thật không may, bạn cần phải thoát cho hệ thống đối tượng / mục tiêu dự định của bạn.
Rudu

7

Ngoài các điểm trong các câu trả lời khác: một điều cần lưu ý nếu bạn đang sử dụng dấu ngoặc kép trong Excel là vị trí của các khoảng trắng của bạn. Nếu bạn có một dòng mã như thế này:

print '%s, "%s", "%s", "%s"' % (value_1, value_2, value_3, value_4)

Excel sẽ coi trích dẫn ban đầu là một trích dẫn theo nghĩa đen thay vì sử dụng nó để thoát dấu phẩy. Mã của bạn sẽ cần phải thay đổi thành

print '%s,"%s","%s","%s"' % (value_1, value_2, value_3, value_4)

Chính sự tinh tế này đã đưa tôi đến đây.


3

Tôi đã đối mặt với cùng một vấn đề và trích dẫn ,không giúp được gì. Cuối cùng, tôi đã thay thế ,bằng +, hoàn thành quá trình xử lý, lưu kết quả đầu ra vào một tệp ngoại lệ và thay thế +bằng ,. Điều này có vẻ xấu nhưng nó làm việc cho tôi.


2
Và bạn sẽ làm gì nếu dữ liệu chứa ký tự "+"?
Andrew Morton

1
@AndrewMorton Vâng, đó là một thách thức. Nhưng trong trường hợp của tôi, tôi chắc chắn rằng điều +đó không tồn tại trong dữ liệu của tôi. Cảm ơn bạn đã bình luận.
Mohammed

4
Cách đơn giản và mạnh mẽ là đặt các chuỗi trong dấu ngoặc kép và thoát dấu ngoặc kép trong chuỗi bằng cách sử dụng hai trong số chúng như thế nào "". Đây là cách làm bình thường.
Andrew Morton

1
Nếu nó không hoạt động, hãy kiểm tra xem bạn không tạo khoảng trắng bên cạnh dấu phẩy phân định của bạn: "Frog", "yellow, green" sẽ hoạt động "Frog", "yellow, green" sẽ không
Dazbert

Cá nhân tôi thấy bình luận thứ hai @AndrewMorton ở đây thực sự đã giúp tôi hiểu những gì làm tốt hơn câu trả lời được chấp nhận. Bước 1 - thoát dấu ngoặc kép trong các trường dữ liệu, ví dụ như trong Python: field = field.replace('"', '""')Bước 2 - sau Bước 1, hãy đặt trường đó vào dấu ngoặc kép, ví dụ field = '"' + field + '"'- tôi nghĩ bạn đang sử dụng gang.
Will Croxford

3

Tùy thuộc vào ngôn ngữ của bạn, có thể có một phương thức to_json có sẵn. Điều đó sẽ thoát khỏi nhiều thứ phá vỡ CSV.


3

Tôi thấy rằng một số ứng dụng như Numbers trong Mac bỏ qua dấu ngoặc kép nếu có khoảng trắng trước nó.

a, "b,c"không hoạt động trong khi a,"b,c"làm việc.


1
Có lẽ bạn vừa tiết kiệm cho tôi một giờ làm việc ... cảm ơn bạn!
Shaun314

1

Bạn có thể mã hóa các giá trị của mình, ví dụ như trong PHP base64_encode ($ str) / base64_decode ($ str)

IMO này đơn giản hơn việc nhân đôi dấu ngoặc kép, v.v.

https://www.php.net/manual/en/feft.base64-encode.php

Các giá trị được mã hóa sẽ không bao giờ chứa dấu phẩy vì vậy mỗi dấu phẩy trong CSV của bạn sẽ là dấu phân cách.



0

Bạn có thể sử dụng Text_Qualifiertrường trong trình quản lý kết nối tệp phẳng của mình thành ". Điều này sẽ bao bọc dữ liệu của bạn trong dấu ngoặc kép và chỉ phân tách bằng dấu phẩy nằm ngoài dấu ngoặc kép.


0

Đầu tiên, nếu giá trị mục có ký tự trích dẫn kép ("), thay thế bằng 2 ký tự trích dẫn kép (" ")

item = item.ToString().Replace("""", """""")

Cuối cùng, bọc giá trị mục:

TRÊN TRÁI: Với ký tự trích dẫn kép (")

TRÊN QUYỀN: Với ký tự trích dẫn kép (") và ký tự dấu phẩy (,)

csv += """" & item.ToString() & ""","

0

Báo giá kép không làm việc cho tôi, nó làm việc cho tôi \". Nếu bạn muốn đặt dấu ngoặc kép làm ví dụ, bạn có thể đặt\"\" .

Bạn có thể xây dựng các công thức, ví dụ:

fprintf(strout, "\"=if(C3=1,\"\"\"\",B3)\"\n");

sẽ viết bằng csv:

= NẾU (C3 = 1, "", B3)


0

Có thể không phải là những gì cần thiết ở đây nhưng đó là một câu hỏi rất cũ và câu trả lời có thể giúp đỡ người khác. Một mẹo tôi thấy hữu ích khi nhập vào Excel bằng một dấu phân cách khác là mở tệp trong trình soạn thảo văn bản và thêm một dòng đầu tiên như:

sep = |

ở đâu | là dấu phân cách bạn muốn Excel sử dụng. Ngoài ra, bạn có thể thay đổi dấu phân cách mặc định trong Windows nhưng hơi dài dòng:

Bảng điều khiển> Đồng hồ & khu vực> Vùng> Định dạng> Bổ sung> Số> Dấu tách danh sách [thay đổi từ dấu phẩy sang lựa chọn thay thế ưa thích của bạn]. Điều đó có nghĩa là Excel cũng sẽ mặc định để xuất CSV bằng cách sử dụng dấu phân cách đã chọn.

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.