Định dạng CSV được phân tách bằng dấu phẩy để buộc Excel diễn giải giá trị dưới dạng chuỗi


64

Tôi đã tìm kiếm một lúc trong khi cố gắng tìm ra cách xuất tệp CSV theo cách để buộc Excel diễn giải các giá trị dưới dạng chuỗi và không cố chuyển đổi chúng thành số hoặc ngày.

ví dụ:

"141", "10/11/2002", "350.00", "1311742251"

Excel cố gắng "chuyển đổi" một cách thông minh tất cả những định dạng này sang định dạng ngày / số gốc. Có cách nào xung quanh đó không?


EDIT: Làm rõ ý định câu hỏi của tôi, xin lỗi vì nhầm lẫn.

Câu trả lời:


67

Đối với những người có quyền kiểm soát dữ liệu nguồn, rõ ràng Excel sẽ tự động phát hiện định dạng của trường CSV trừ khi cột CSV có định dạng này:

"=""Data Here"""

ví dụ...

20,       5.5%,      "0404 123 351", "3-6",  "=""123"""
[number]  [percent]  [number]        [date]  [string]  <-- how Excel interprets

Nó cũng hoạt động trong Bảng tính Google, nhưng không chắc các ứng dụng bảng tính khác có hỗ trợ ký hiệu này hay không.

Nếu bạn nghi ngờ bất kỳ dữ liệu nào có thể chứa dấu ngoặc kép, bạn cần phải thoát hai lần chúng, như thế này ...

"=""She said """"Hello"""" to him"""



(EDIT: Được cập nhật với các chỉnh sửa, cảm ơn DMA57361!)


Tuyệt vời, chúng ta chỉ cần thay đổi dữ liệu .. thở dài
đắt tiền

4
Cột cuối cùng đó phải được "=""123"""hình thành xấu. Các trường có chứa một "phải được phân định và "s trong trường thoát với các "s khác .
DMA57361

@ DMA57361 thực sự là cách anh ấy có nó là tốt, đó là hai lĩnh vực khác bên cạnh nó bị thiếu dấu bằng. Những gì anh ta đặt ở đó là thiết lập công thức của ô đó để trả về một chuỗi. Để tránh điều này, bạn có thể đặt loại dữ liệu của ô thành "Văn bản".
Đột phá

2
@BreakENC mà bảng ở đó đại diện cho một tệp CSV, không phải các trường Excel. Giá trị cuối cùng ="123"không phải là trường CSV hợp lệ vì nó chứa ký tự phân cách trường " mà không phân định chính xác nó hoặc trường. Thực tế Excel tình cờ đọc nó như một công thức hoàn toàn phụ thuộc vào Excel và không liên quan gì đến tệp CSV.
DMA57361

2
@PriceChild, quan điểm của câu hỏi ban đầu của tôi (mà tôi thực sự không giải thích rõ lắm) thực ra là cách định dạng CSV để giúp người dùng dễ dàng nhất có thể . Và đây là câu trả lời tôi tìm thấy chính mình và muốn đăng. DMA57361 thực sự đã mang lại một sự điều chỉnh hữu ích, cảm ơn!
Simon East

36

Giống như nhiều người khác, tôi đã phải vật lộn với những quyết định tương tự mà Microsoft đưa ra và thử nhiều giải pháp được đề xuất.

Đối với Excel 2007 như sau:

  • Đặt tất cả các giá trị trong dấu ngoặc kép KHÔNG giúp
  • Đặt an = trước tất cả các giá trị sau khi đặt chúng vào các quẻ đôi giúp, NHƯNG làm cho tệp csv trở nên vô dụng đối với hầu hết các ứng dụng khác
  • Đặt dấu ngoặc đơn quanh dấu ngoặc kép xung quanh tất cả các giá trị là rác
  • Đặt một khoảng trắng trước tất cả các giá trị trước khi đặt dấu ngoặc kép xung quanh chúng KHÔNG ngăn chuyển đổi thành ngày, nhưng KHÔNG ngăn chặn việc cắt các số 0 đứng đầu hoặc dấu.
  • Đặt một trích dẫn trước một giá trị chỉ hoạt động khi nhập dữ liệu trong Excel.

Tuy nhiên:

Đặt một tab trước tất cả các giá trị trước khi đặt dấu ngoặc kép xung quanh chúng KHÔNG ngăn chuyển đổi thành ngày VÀ KHÔNG ngăn cắt các số 0 ở đầu hoặc cuối và trang tính thậm chí không hiển thị các dấu hiệu cảnh báo khó chịu ở góc trên bên trái của mỗi ô.

Ví dụ:

"<tab character><some value>","<tab character><some other value>"

Lưu ý rằng ký tự tab phải nằm trong dấu ngoặc kép. Chỉnh sửa: hóa ra dấu ngoặc kép thậm chí không cần thiết.

Nhấp đúp vào tệp csv có thể mở tệp dưới dạng bảng tính trong Excel hiển thị tất cả các giá trị được xử lý như ở trên, như dữ liệu văn bản. Đảm bảo đặt Excel để sử dụng '.' là dấu thập phân và không phải là ',' hoặc mỗi dòng của tệp csv sẽ kết thúc dưới dạng một văn bản trong ô đầu tiên của mỗi hàng. Rõ ràng Microsoft nghĩ rằng CSV có nghĩa là "Không phải là dấu thập phân" Giá trị tách biệt.


Thủ thuật tab này đã lưu ngày của tôi, Excel đã chuyển đổi các giá trị số thực sự dài thành số và mất tất cả các chữ số sau ngày 15. Quản lý để có được Excel để coi chúng là văn bản với tiền tố tab. Vì vậy, làm việc cho số là tốt, không chỉ ngày.
Markus Yrjölä

Điều này thực sự hữu ích, cảm ơn bạn!
Flavio

22

Sử dụng chức năng nhập của Excel cho phép bạn chỉ định định dạng (tự động, văn bản hoặc ngày) mỗi cột nên được hiểu là và không yêu cầu bất kỳ sửa đổi nào đối với các tệp dữ liệu.

Bạn có thể tìm thấy nó dưới dạng DataGet External DataFrom Texttrong Excel 2007/2010.
Hoặc DataImport External DataImport Datatrong Excel 2003.

Đây là hình ảnh của Trình hướng dẫn nhập văn bản Excel 2003 đang hoạt động trên dữ liệu mẫu được cung cấp, cho tôi thấy việc nhập hai cột sau dưới dạng văn bản:

Excel 2003: Trình hướng dẫn nhập văn bản ở Bước 3 - kiểu dữ liệu


Câu trả lời tuyệt vời DMA57361, cảm ơn tất cả các chi tiết. Điều tôi không thực sự đề cập đến trong câu hỏi của mình là tôi đang viết một tập lệnh xuất dữ liệu sang Excel, vì vậy tôi đã cố gắng ngăn người dùng phải chuyển qua các tùy chọn khó hiểu như thế này. Nhưng dù sao bạn cũng bình chọn. :-)
Simon East

@Simon, bạn đang viết kịch bản gì vậy? Bất kỳ cách nào bạn có thể có được nó để sản xuất các tệp Excel thực tế trực tiếp, thay vì đi qua một định dạng trung gian?
DMA57361

đó là tập lệnh PHP xuất bảng cơ sở dữ liệu. CSV có thể dễ làm việc nhất, nhưng bạn đã đúng, tôi có thể tạo XLS với sự trợ giúp của một số mã nguồn mở hoặc thậm chí chỉ là một bảng HTML mà tôi nghĩ từ kinh nghiệm trong quá khứ tạo ra kết quả hợp lý trong Excel (cho phép màu sắc và định dạng, vv, nhưng không chắc chắn về kiểu dữ liệu).
Simon East

1
Có một vài câu hỏi về SO về PHP → Excel, vài câu hỏi đầu tiên tôi đã thử đều có câu trả lời chỉ vào PHP Excel , vì vậy điều đó có thể đáng xem.
DMA57361

Điều đó rất hữu ích, sau khi đọc khá nhiều câu trả lời
greg121

1

Ví dụ từ Simon không hiệu quả với tôi và tôi nghi ngờ đó là một sự khác biệt về ngôn ngữ. Trong C # đây là chuỗi định dạng làm việc của tôi trông như thế nào:

var linebreak = (i++ == list.Count) ? "" : "\r\n";

csv += String.Format("=\"{0}\",{1},{2},{3},=\"{4}\"{5}",
    item.Value, item.Status, item.NewStatus, item.Carrier, c.Status, linebreak);

và đây là những gì các tập tin đầu ra trông như:

="abababababab",INVALID,INVALID,USPS,="",
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793482982812",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793482982812",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793000216184",UNKNOWNSTATUS,INVALID,USPS,=""

Có thể thấy, định dạng trong tệp đầu ra ="VALUE",không phải là định dạng "=""VALUE""",mà tôi tin có thể là quy ước Visual Basic.

Tôi đang sử dụng Excel 2010. Ngẫu nhiên, Google Sheets sẽ không mở / chuyển đổi tệp được định dạng theo cách này. Nó sẽ hoạt động nếu bạn loại bỏ dấu bằng như vậy "VALUE",- Excel vẫn sẽ mở tệp nhưng bỏ qua thực tế là bạn muốn các cột của mình là chuỗi.


-2

Một cách đơn giản để buộc Excel diễn giải ngày dưới dạng văn bản là đặt một trích dẫn trước ngày, thay vì sử dụng dấu ngoặc kép đầy đủ, như trong:

10/11/11/2002

Nếu bạn có thể nhập CSV thay vì mở nó, bạn có thể cho Excel biết định dạng của mỗi cột. Có một cái nhìn vào câu hỏi này tôi hỏi .


5
Bị hạ cấp do điều này KHÔNG hoạt động trong các tệp CSV được nhập vào Excel. Excel diễn giải trích dẫn dưới dạng trích dẫn bằng chữ và do đó hiển thị nó trong ô.
psynnott
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.