Ngăn Excel tự động chuyển đổi các giá trị văn bản nhất định thành ngày


526

Có ai tình cờ biết nếu có mã thông báo tôi có thể thêm vào csv của mình cho một trường nhất định để Excel không thử chuyển đổi nó thành ngày không?

Tôi đang cố gắng viết tệp .csv từ ứng dụng của mình và một trong những giá trị xảy ra trông giống như một ngày mà Excel sẽ tự động chuyển đổi nó từ văn bản sang ngày. Tôi đã thử đặt tất cả các trường văn bản của mình (bao gồm cả trường trông giống như một ngày) trong dấu ngoặc kép, nhưng điều đó không có hiệu lực.


120
Vâng, giống như khi một tệp có 10000 tên người dùng có một tên như "april25", được chuyển đổi thành một ngày và cuối cùng được xử lý là "apr-25", dẫn đến lỗi "không tìm thấy tên người dùng", vì bạn đã không mong đợi Excel sẽ chuyển đổi một giá trị thành một ngày, 4000 bản ghi vào tệp trong khi để lại văn bản còn lại. Mã đọc CSV nào khập khiễng; thực sự, không phải đoán loại dựa trên các bản ghi X đầu tiên và gắn bó với nó sao? Hoặc để lại tất cả văn bản. Nếu tôi muốn nó được định dạng là "chung", tôi có thể chọn nó sau. Bằng cách giả sử "chung" ngay từ đầu, nó có nguy cơ tham nhũng dữ liệu văn bản.
Triynko

Tôi đã có vấn đề khi làm bản sao và dán. Đối với tất cả tìm kiếm giải pháp, chọn cột mục tiêu, đặt nó thành định dạng chuỗi / văn bản, sau đó sao chép nguồn và thực hiện dán đặc biệt (nhấp chuột phải) với 'chỉ giá trị'. Giữ nguyên giá trị, không định dạng ngày.
Kai Noack

84
Tôi chỉ muốn thêm rằng tôi coi hành vi này của Excel là một lỗ hổng nghiêm trọng. Thế còn tất cả những người không có sự sang trọng để thay đổi nội dung của tệp csv trước khi nhập vào Excel thì sao? Hoặc những người không nhận ra vấn đề này cho đến khi thực hiện nhiều thay đổi khác đối với tệp CSV thì sao? Nó làm cho việc làm việc với các tệp CSV trong Excel trở nên lộn xộn.
cướp

Bạn đang sử dụng DatitableJS? Bởi vì tôi đã biết cách thực hiện điều này với API đó. Nếu bạn cần điều này, bạn có thể tìm thấy nó ở đây: stackoverflow.com/a/36142043/4241058
Richard Rebeco

11
Tất cả những giải pháp này để sử dụng Tệp -> Mở -> Nhập công việc đều ổn đối với chúng tôi vì chúng tôi biết những gì chúng tôi đang làm, nhưng 99,5% khác trên thế giới không hiểu điều hướng hệ thống tệp từ / trong / an là vô ích ứng dụng. Họ thấy một tập tin, để sử dụng nó, họ nhấp đúp vào nó. Tôi đã dành 25 năm để dạy mọi người cách sử dụng các ứng dụng văn phòng và viết mã tạo dữ liệu cho các ứng dụng văn phòng nói trên và việc sử dụng / application / để tìm tệp để sử dụng là hoàn toàn vượt xa mọi người.
dùng2624417

Câu trả lời:


355

Tôi đã thấy rằng việc đặt '=' trước dấu ngoặc kép sẽ hoàn thành những gì bạn muốn. Nó buộc dữ liệu là văn bản.

ví dụ. = "2008-10-03", = "thêm văn bản"

EDIT (theo các bài đăng khác) : do lỗi Excel 2007 được Jeffiekins lưu ý, người ta nên sử dụng giải pháp do Andrew đề xuất :"=""2008-10-03"""


12
Tôi chấp nhận câu trả lời này vì 1) tệp csv của tôi sẽ chỉ được sử dụng bởi Excel và 2) đây là cho kế toán và không thể có 'lúc đầu và 3) Tôi không muốn chúng phải làm một nhập khẩu. Tôi chỉ muốn họ mở csv.

5
Tuyệt quá! Nhưng do lỗi Excel 2007, hãy sử dụng giải pháp được đề xuất bởi Andrew : "=""2008-10-03""". Cập nhật bài viết.
TMS

1
Điều này không phù hợp với tôi trong Excel 2010 nếu văn bản quá dài :(
steve

7
Lý do điều này hoạt động là vì khi Excel thấy ký tự "=", nó quyết định đánh giá biểu thức theo sau nó. Trong trường hợp này, biểu thức chỉ đơn giản là một chuỗi ký tự và giá trị của một chuỗi ký tự là nội dung của chuỗi. Do đó, dấu ngoặc kép biến mất một cách kỳ diệu. Bạn có thể đặt = 1 + 2 + 3 và nhận giá trị 6 sau khi nhập CSV. Công thức tự nó không bị phá hủy trong quá trình nhập khẩu.
lokori

4
Có một vấn đề lớn với cách tiếp cận này - nếu bạn mở tệp trong excel và chỉnh sửa rồi lưu và mở lại tất cả những thứ này "biến mất
ACV

150

Tôi biết đây là một câu hỏi cũ, nhưng vấn đề sẽ không biến mất sớm. Các tệp CSV dễ dàng được tạo từ hầu hết các ngôn ngữ lập trình, khá nhỏ, có thể đọc được bằng con người trong một cuộc khủng hoảng với trình soạn thảo văn bản đơn giản và có mặt khắp nơi.

Vấn đề không chỉ là ngày tháng trong các trường văn bản, mà bất kỳ số nào cũng được chuyển đổi từ văn bản sang số. Một vài ví dụ trong đó có vấn đề:

  • Mã bưu điện / bưu chính
  • số điện thoại
  • số ID chính phủ

mà đôi khi có thể bắt đầu bằng một hoặc nhiều số 0 (0), được bỏ đi khi chuyển thành số. Hoặc giá trị chứa các ký tự có thể bị nhầm lẫn với các toán tử toán học (như trong ngày: /, -).

Hai trường hợp mà tôi có thể nghĩ rằng giải pháp "trả trước =", như đã đề cập trước đây, có thể không lý tưởng

  • trong đó tệp có thể được nhập vào một chương trình không phải là MS Excel (chức năng Trộn thư của MS Word xuất hiện trong tâm trí),
  • nơi mà khả năng đọc của con người có thể quan trọng.

Hack của tôi để làm việc xung quanh này

Nếu một trước / thêm một ký tự không phải là số và / hoặc không ngày trong giá trị, giá trị sẽ được nhận dạng dưới dạng văn bản và không được chuyển đổi. Một ký tự không in sẽ tốt vì nó sẽ không làm thay đổi giá trị được hiển thị. Tuy nhiên, ký tự không gian cũ đơn giản (\ s, ASCII 32) không hoạt động cho điều này vì nó bị băm nhỏ bởi Excel và sau đó giá trị vẫn được chuyển đổi. Nhưng có nhiều ký tự không gian in và không in khác sẽ hoạt động tốt. Tuy nhiên, cách dễ nhấtnối thêm (thêm sau) ký tự tab đơn giản (\ t, ASCII 9).

Lợi ích của phương pháp này:

  • Có sẵn từ bàn phím hoặc với mã ASCII dễ nhớ (9),
  • Nó không làm phiền việc nhập khẩu,
  • Thông thường không làm phiền kết quả Trộn thư (tùy thuộc vào bố cục mẫu - nhưng thông thường, nó chỉ thêm một khoảng trống ở cuối dòng). (Nếu đây là một vấn đề, hãy xem các ký tự khác, ví dụ: không gian có độ rộng bằng không (ZWSP, Unicode U + 200B)
  • không phải là trở ngại lớn khi xem CSV trong Notepad (v.v.),
  • và có thể được xóa bằng cách tìm / thay thế trong Excel (hoặc Notepad, v.v.).
  • Bạn không cần nhập CSV, nhưng chỉ cần nhấp đúp để mở CSV trong Excel.

Nếu có lý do bạn không muốn sử dụng tab, hãy tìm trong bảng Unicode để biết thứ gì khác phù hợp.

Một lựa chọn khác

có thể là để tạo các tệp XML, trong đó một định dạng nhất định cũng được chấp nhận để nhập bởi các phiên bản MS Excel mới hơn và cho phép nhiều tùy chọn tương tự như định dạng .XLS, nhưng tôi không có kinh nghiệm với điều này.

Vì vậy, có nhiều lựa chọn khác nhau. Tùy thuộc vào yêu cầu / ứng dụng của bạn, cái này có thể tốt hơn cái khác.


Thêm vào

Cần phải nói rằng các phiên bản mới hơn (2013+) của MS Excel không mở CSV ở định dạng bảng tính nữa - thêm một lần tăng tốc trong quy trình làm việc của một người làm cho Excel trở nên ít hữu ích hơn ... Ít nhất, tồn tại các hướng dẫn để giải quyết. Xem ví dụ: Stackoverflow này: Làm cách nào để hiển thị chính xác các tệp .csv trong Excel 2013? .


6
Tôi đã nhận được các số 0 chính xác sau khi thêm \tvào ký tự phân tách của mình ;... chết tiệt MS Office, tại sao điều này phải khiến tôi mất hơn 2 phút để tìm ra?
Morten Jensen

2
Thêm \ t vào cuối tất cả các giá trị thực sự là mẹo. Đó là một cách giải quyết khó khăn, nhưng trong thực tế, nó hoạt động tốt. Tôi thích điều này hơn với thủ thuật công thức với '=' bằng nhau, bởi vì công cụ trước đây có thể khó làm việc với các công cụ khác.
ocroquette

3
Không có đủ upvote có thể bày tỏ lòng biết ơn của tôi dành cho bạn. Tìm kiếm và thay thế trong notepad ++ ',' thành '\ t, \ t' (để phù hợp với các cột đầu tiên và cuối cùng) hoạt động như một bùa mê. Cảm ơn.
Asaf

1
Trong truy vấn MySQL của tôi (đối với đầu ra CSV thông qua PHP), tôi đã sử dụng CONCAT ('\ t', column_name). Cũng đã lừa. Cảm ơn!
Chỉ cần đồng bằng cao

1
Ý tưởng tuyệt vời. Than ôi, Số là một chút "thông minh" hơn so với Excel và không rơi vào thủ thuật tab. Giải pháp thay thế tốt nhất tôi có thể đưa ra là dẫn đầu ', vì nó được hiểu rõ và không quá mất tập trung ... nhưng một thứ vô hình sẽ tốt hơn.
Heath Raftery

101

Làm việc với giải pháp của Jarod và vấn đề do Jeffiekins đưa ra, bạn có thể sửa đổi

"May 16, 2011"

đến

"=""May 16, 2011"""

6
Không hoạt động trong Excel 2010 nếu văn bản dài hơn một độ dài nhất định.
steve

1
@Andrew, "sửa chữa" này sẽ gây ra vấn đề nếu bạn cần có "các giá trị ở bất cứ đâu giữa ngày.
Pacerier

8
FYI, nếu bạn lưu tệp Excel thì = sẽ biến mất và bạn quay lại hình vuông vào lần tiếp theo khi bạn mở.
d512

Kinh nghiệm của tôi phù hợp với cả steve và d512. Nó hoạt động với tôi trong .csv đến trong Excel 2013 và sau khi lưu dưới dạng .xlsx, nó không hoàn nguyên. Đủ dễ dàng để mọi người kiểm tra bằng cách sử dụng hàng dữ liệu này: "806676", "Không", "41", "=" "Ngày 16 tháng 5 năm 2011" "", "100.00", "Sai"
tbc0

1
@ tbc0 Hãy thử "806676","None","41","=""05-16-2011""","100.00","False"thay thế và bạn sẽ thấy lưu và tải lại làm mất văn bản có gạch nối.
NetMage

65

Tôi đã có một vấn đề tương tự và đây là cách giải quyết giúp tôi mà không phải chỉnh sửa nội dung tệp csv:

Nếu bạn có thể linh hoạt đặt tên cho tệp một cái gì đó không phải là ".csv", bạn có thể đặt tên cho nó bằng một phần mở rộng ".txt", chẳng hạn như "Myfile.txt" hoặc "Myfile.csv.txt". Sau đó, khi bạn mở nó trong Excel (không phải bằng cách kéo và thả, mà bằng cách sử dụng Tệp-> Mở hoặc danh sách tệp được sử dụng gần đây nhất), Excel sẽ cung cấp cho bạn "Trình hướng dẫn nhập văn bản".

Trong trang đầu tiên của trình hướng dẫn, chọn "Được phân cách" cho loại tệp.

Trong trang thứ hai của trình hướng dẫn chọn "," làm dấu phân cách và cũng chọn trình phân loại văn bản nếu bạn đã bao quanh các giá trị của mình bằng dấu ngoặc kép

Trong trang thứ ba, chọn từng cột riêng lẻ và chỉ định từng loại "Văn bản" thay vì "Chung" để ngăn Excel khỏi làm rối dữ liệu của bạn.

Hy vọng điều này sẽ giúp bạn hoặc ai đó có vấn đề tương tự!


2
Ồ, nhân tiện tôi không phải là người đầu tiên phát hiện ra điều này. Risingline.com/use-excel-read-csv-without-reformatted.php Trang web đó cũng có hướng dẫn hữu ích mà bạn có thể thay đổi nhấp vào các cột trong trang thứ ba của trình hướng dẫn để chọn tất cả chúng cùng nhau trước khi gán từng loại "Bản văn".
cơn mưa

Điều này có thể hoạt động cho các giá trị ngày, nhưng dường như nó không hoạt động đối với những thứ excel diễn giải dưới dạng số. Nếu chuỗi của bạn là tất cả các số và dấu phẩy, định dạng "Văn bản" sẽ là định dạng số khoa học.
Michael - Clay Shirky ở đâu

3
điều này hoạt động hoàn hảo với tôi và không liên quan đến bất kỳ thay đổi nào đối với tệp của tôi ngoại trừ đổi tên thành .txt. cảm ơn bạn.
Kevin

1
Thật không may, Excel chỉ cho phép bạn làm điều này trong 6 cột đầu tiên. Nếu bạn cần nhiều hơn, cách tiếp cận tốt hơn là sao chép nội dung của tệp csv, tạo và làm trống tệp excel, chọn tất cả các cột / hàng và đặt loại thành Văn bản, sau đó dán nội dung và sử dụng Dữ liệu | Chuyển văn bản sang cột
nachocab

Đây là giải pháp tốt nhất và nên được đánh dấu là câu trả lời.
Cướp

28

CẢNH BÁO: Excel '07 (ít nhất) có lỗi (chưa có): nếu có dấu phẩy trong nội dung của một trường, thì nó không phân tích chính xác = "trường, nội dung", mà đặt mọi thứ sau dấu phẩy vào lĩnh vực sau, bất kể dấu ngoặc kép.

Cách giải quyết duy nhất tôi thấy rằng hoạt động là loại bỏ = khi nội dung trường bao gồm dấu phẩy.

Điều này có thể có nghĩa là có một số trường không thể biểu thị chính xác "đúng" trong Excel, nhưng đến bây giờ tôi tin rằng không ai quá ngạc nhiên.


Tôi mới thử nghiệm điều này trong excel 2007 và nó hoạt động chính xác với tôi. Tuy nhiên, nếu có một khoảng trắng đứng trước dấu ngoặc kép thì nó không phân tích dấu phẩy chính xác.
Sunny88

8
Điều này dường như không phải là một lỗi theo RFC 4180. Cách chính xác để trích dẫn trường là trích dẫn toàn bộ trường và sau đó trích dẫn kép trích dẫn nội bộ. Vì vậy, "=" "trường, nội dung" "" tools.ietf.org/html/rfc4180
Peter Stephens

2
@PeterStephens, Điều này không hoạt động nếu field, content"trong đó. Ví dụ:"=""field, co""ntent"""
Pacerier

1
@Pacerier Có lẽ trích dẫn được nhúng phải được trích dẫn gấp đôi, biến thành """".
ErikE

Tôi có thể xác nhận đề xuất của @ ErikE là chính xác. Đối với một trường có giá trị 1"2, nếu bạn chọn sử dụng thủ thuật này (trái ngược với việc chỉ để nó như "1""2"trong tệp - excel sẽ được coi là văn bản), thì chuỗi chính xác cuối cùng trong tệp CSV nhắm mục tiêu Excel sẽ kết thúc được "=""1""""2""".
Tao

22

Trong khi tạo chuỗi được ghi vào tệp CSV của tôi bằng C #, tôi phải định dạng chuỗi theo cách này:

"=\"" + myVariable + "\""

2
điều này cũng cho tôi trong Rails. Cảm ơn
Vieenay Siingh

3
Hoạt động trên Java cũng vậy
Shoyo

Làm việc cho tôi trong JavaScript bằng Papa Parse.
wobsoriano

17

2018

Giải pháp thích hợp duy nhất phù hợp với tôi (và cũng không cần sửa đổi CSV ).

Excel 2010:

  1. Tạo sổ làm việc mới
  2. Dữ liệu> Từ văn bản> Chọn tệp CSV của bạn
  3. Trong cửa sổ bật lên, chọn nút radio "Được phân cách", sau đó nhấp vào "Tiếp theo>"
  4. Các hộp kiểm phân cách: đánh dấu chỉ "Dấu phẩy" và bỏ chọn các tùy chọn khác, sau đó nhấp vào "Tiếp theo>"
  5. Trong "Xem trước dữ liệu", cuộn sang bên phải, sau đó giữ shift và nhấp vào cột cuối cùng (điều này sẽ chọn tất cả các cột). Bây giờ trong "Định dạng dữ liệu cột", chọn nút radio "Văn bản", sau đó nhấp vào "Hoàn tất".

Excel office365: (phiên bản máy khách)

  1. Tạo sổ làm việc mới
  2. Dữ liệu> Từ Văn bản / CSV> Chọn tệp CSV của bạn
  3. Phát hiện kiểu dữ liệu> không phát hiện

Lưu ý: Excel office365 (phiên bản web), vì tôi đang viết bài này, bạn sẽ không thể làm điều đó.


3
Điều này hoạt động mà không thay đổi các tệp CSV trước đó, vì vậy tôi nghĩ rằng đây phải là câu trả lời chính xác.
Jack

Điều này có vẻ như câu trả lời chính xác. Tôi đã có hy vọng cao. Nhưng trên MacOS (office365), tôi không thể chọn TẤT CẢ các cột: không có cuộn ngang trong cửa sổ xem trước được hiển thị trong trình hướng dẫn nhập văn bản, do đó tôi chỉ có thể chọn các cột hiển thị. Tôi đã thử cắt ngắn (CMD + A, hoặc những thứ khác), nhưng không có kết quả. Tùy chọn "không phát hiện" cũng không tồn tại. Tôi bị tàn phá.
Normanius

Excel office 365, chọn Tệp, Tùy chọn, Dữ liệu. Có các hộp kiểm để hiển thị trình hướng dẫn nhập dữ liệu cũ nếu cần.
Kurt Schultz

15

Trong Excel 2010 mở một trang tính mới. Trên ruy-băng dữ liệu bấm vào "Lấy dữ liệu ngoài từ văn bản". Chọn tệp CSV của bạn sau đó nhấp vào "Mở". Nhấn tiếp". Bỏ chọn "Tab", đặt dấu kiểm bên cạnh "Dấu phẩy", sau đó nhấp vào "Tiếp theo". Nhấp vào bất cứ nơi nào trên cột đầu tiên. Trong khi giữ phím shift, kéo thanh trượt qua cho đến khi bạn có thể nhấp vào cột cuối cùng, sau đó nhả phím shift. Nhấp vào nút radio "văn bản", sau đó nhấp vào "Kết thúc"

Tất cả các cột sẽ được nhập dưới dạng văn bản, giống như trong tệp CSV.


1
Tôi gặp vấn đề tương tự, nhưng làm theo hướng dẫn của @ Rob cẩn thận sẽ hoạt động hoàn hảo!. Cảm ơn bạn
Millists

2
Rất tiếc, trợ lý Data From Text không hỗ trợ các ô đa dòng. Nếu gặp một văn bản nhiều dòng như vậy, nó sẽ ghi tất cả các dòng sau hàng đầu tiên vào các hàng mới, phá vỡ toàn bộ quá trình nhập. Nó chỉ diễn giải ngắt dòng chính xác nếu bạn mở tệp CSV bằng cách nhấp đúp. Chết tiệt Microsoft ...
CodeManX

1
Thật không may, điều này không giải quyết được vấn đề "trợ giúp" định dạng ngẫu nhiên của Excel - văn bản DEC1 vẫn được thay đổi thành ngày 01 tháng 12. Tương tự với văn bản của YYYY-MM-DD được chuyển sang DD / MM / YYYY. :(
Baracus

12

Vẫn còn một vấn đề trong bản phát hành Microsoft Office 2016, khá đáng lo ngại đối với những người trong chúng ta làm việc với các tên gen như MARC1, MARCH1, SEPT1, v.v. Giải pháp tôi thấy là thực tế nhất sau khi tạo tệp ".csv" trong R, sau đó sẽ được mở / chia sẻ với người dùng Excel:

  1. Mở tệp CSV dưới dạng văn bản (notepad)
  2. Sao chép nó (ctrl + a, ctrl + c).
  3. Dán nó vào một bảng excel mới - tất cả sẽ dán vào một cột dưới dạng chuỗi văn bản dài.
  4. Chọn / chọn cột này.
  5. Chuyển đến Dữ liệu- "Chuyển văn bản thành cột ...", trên cửa sổ mở, chọn "phân cách" (tiếp theo). Kiểm tra xem "dấu phẩy" đã được đánh dấu (đánh dấu nó sẽ hiển thị việc tách dữ liệu thành các cột bên dưới) (tiếp theo), trong cửa sổ này bạn có thể chọn cột bạn muốn và đánh dấu là văn bản (thay vì chung) (Kết thúc).

HTH


Những nỗ lực thủ công cũng không hấp dẫn đối với tôi. Tuy nhiên, sau khi cạn kiệt mọi khả năng trong tay, đây là thứ mạnh mẽ và đáng tin cậy nhất.
Ana Maria Mendes-Pereira

Xử lý hàng loạt dù sao.
Ana Maria Mendes-Pereira

Đây thực sự là câu trả lời tốt nhất ở đây đòi hỏi ít công việc nhất. Tôi ước bạn có thể đặt một số tùy chọn để buộc nó không phân tích tệp.
cuộn

Bạn cũng có thể thay thế tất cả dấu phẩy bằng các tab, sau đó nó sẽ tự động phân định
cuộn vào

10

Đây là phương pháp đơn giản mà chúng ta sử dụng tại nơi làm việc ở đây khi tạo tệp csv ở vị trí đầu tiên, nó thay đổi các giá trị một chút nên không phù hợp trong tất cả các ứng dụng:

Chuẩn bị một không gian cho tất cả các giá trị trong csv

Không gian này sẽ bị loại bỏ bởi excel từ các số như "1", "2.3" và "-2.9e4" nhưng sẽ vẫn còn vào các ngày như "01/10/1993" và booleans như "TRUE", ngăn chúng được chuyển đổi thành loại dữ liệu nội bộ của excel.

Nó cũng dừng các trích dẫn kép được đọc khi đọc, vì vậy cách tạo văn bản trong csv không thay đổi bằng excel NGAY CẢ NẾU là một số văn bản như "3.1415" là bao quanh nó bằng dấu ngoặc kép VÀ đặt trước toàn bộ chuỗi bằng một khoảng trắng, tức là (sử dụng dấu ngoặc đơn để hiển thị nội dung bạn sẽ nhập) '"3.1415"'. Sau đó, trong excel bạn luôn có chuỗi gốc, ngoại trừ nó được bao quanh bởi dấu ngoặc kép và được thêm vào bởi một khoảng trắng, do đó bạn cần tính đến các chuỗi trong bất kỳ công thức nào, v.v.


Điều này làm việc cho tôi. Tôi đã có một số giá trị như 1-1-1 được tự động chuyển đổi thành ngày. Như đã đề cập, không gian sẽ chuyển để giá trị được thay đổi, nhưng tôi thực hiện một dải trên đó khi phân tích cú pháp để đối với tôi đó không phải là vấn đề lớn.
jacklin

Không gian không còn hoạt động để ngăn chặn việc giải thích ngày hoặc tước các số không hàng đầu. Nhưng bạn có thể sử dụng một không gian phá vỡ "\xA0"thay thế - điều đó sẽ làm việc.
Doin

8

(Giả sử Excel 2003 ...)

Khi sử dụng Trình hướng dẫn chuyển văn bản thành cột, trong Bước 3, bạn có thể ra lệnh loại dữ liệu cho từng cột. Nhấp vào cột trong phần xem trước và thay đổi cột ghi sai từ "Chung" thành "Văn bản".


8
Đây là một lựa chọn tuyệt vời nếu tôi có thể buộc người dùng sử dụng quy trình nhập.

Điều này thực sự không giúp ích gì cho vấn đề, vì các số trong cột TEXT sẽ được chuyển đổi thành NUMBERS khi xuất sang .csv dù sao ...
Chonez

8

Đây là một cách duy nhất tôi biết làm thế nào để thực hiện điều này mà không làm hỏng bên trong tệp. Như thường lệ với Excel, tôi đã học được điều này bằng cách đập đầu vào bàn trong nhiều giờ.

Thay đổi phần mở rộng tệp .csv thành .txt; điều này sẽ ngăn Excel tự động chuyển đổi tệp khi nó được mở. Đây là cách tôi thực hiện: mở Excel sang một trang tính trống, đóng trang trống, sau đó Tệp => Mở và chọn tệp của bạn với phần mở rộng .txt. Điều này buộc Excel phải mở "Trình hướng dẫn nhập văn bản" nơi nó sẽ hỏi bạn các câu hỏi về cách bạn muốn nó diễn giải tệp. Trước tiên, bạn chọn dấu phân cách (dấu phẩy, tab, v.v.), sau đó (đây là phần quan trọng) bạn chọn một cột cột được đặt và chọn định dạng. Nếu bạn muốn chính xác những gì trong tệp thì chọn "Văn bản" và Excel sẽ chỉ hiển thị những gì giữa các dấu phân cách.


Điều này chỉ hoạt động tốt với tôi vào 2015/03/03 làm việc với Excel cho Mac 2011 (phiên bản 14.4.8 150116), làm việc với dữ liệu trong câu hỏi SO awk- tránh định dạng lại các giá trị giống như ngày , trong đó vấn đề là với Excel hơn awk, mặc dù tiêu đề câu hỏi.
Jonathan Leffler

4

(EXCEL 2007 trở lên)

Cách buộc excel không "phát hiện" định dạng ngày mà không chỉnh sửa tệp nguồn

Hoặc:

  • đổi tên tập tin thành .txt
  • Nếu bạn không thể làm điều đó, thay vì mở tệp CSV trực tiếp trong excel, hãy tạo một sổ làm việc mới, sau đó đi đến
    Data > Get external data > From Text
    và chọn CSV của bạn.

Dù bằng cách nào, bạn sẽ được cung cấp các tùy chọn nhập, chỉ cần chọn từng cột chứa ngày và báo cho excel định dạng là "văn bản" chứ không phải "chung".


4

Những gì tôi đã làm cho cùng một vấn đề này là thêm vào sau mỗi giá trị csv: "=" "" và một trích dẫn kép sau mỗi giá trị CSV, trước khi mở tệp trong Excel. Lấy các giá trị sau đây làm ví dụ:

012345,00198475

Chúng nên được thay đổi trước khi mở trong Excel thành:

"="""012345","="""00198475"

Sau khi bạn thực hiện việc này, mọi giá trị ô xuất hiện dưới dạng công thức trong Excel và do đó sẽ không được định dạng dưới dạng số, ngày, v.v. Ví dụ: giá trị 012345 xuất hiện dưới dạng:

="012345"

Một cách tiếp cận khác là lưu trữ số trong csv như 1234500198475E-8; cách này tính toán thêm trong excel vẫn sẽ có thể.
bert bruynooghe

4

Không có giải pháp nào được cung cấp ở đây là một giải pháp tốt. Nó có thể hoạt động cho từng trường hợp riêng lẻ, nhưng chỉ khi bạn kiểm soát màn hình cuối cùng. Lấy ví dụ của tôi: công việc của tôi tạo ra danh sách các sản phẩm họ bán cho bán lẻ. Đây là định dạng CSV và chứa mã bộ phận, một số mã bắt đầu bằng số 0, được đặt bởi nhà sản xuất (không thuộc quyền kiểm soát của chúng tôi). Lấy đi các số 0 hàng đầu và bạn thực sự có thể phù hợp với một sản phẩm khác. Khách hàng bán lẻ muốn danh sách ở định dạng CSV vì các chương trình xử lý back-end, nằm ngoài tầm kiểm soát của chúng tôi và khác nhau đối với mỗi khách hàng, vì vậy chúng tôi không thể thay đổi định dạng của các tệp CSV. Không có tiền tố '=', cũng không thêm các tab. Dữ liệu trong các tệp CSV thô là chính xác; Khi khách hàng mở các tệp đó trong Excel, các sự cố sẽ bắt đầu. Và nhiều khách hàng không thực sự hiểu biết về máy tính. Họ chỉ có thể mở và lưu một tệp đính kèm email. Chúng tôi đang nghĩ đến việc cung cấp dữ liệu theo hai định dạng hơi khác nhau: một là thân thiện với Excel (sử dụng các tùy chọn được đề xuất ở trên bằng cách thêm TAB, một tùy chọn khác là 'chính chủ'. Trong khi đó, chúng tôi cần tiếp tục giải thích lý do tại sao đôi khi họ thấy dữ liệu 'sai' trong bảng tính của mình. Cho đến khi Microsoft thực hiện thay đổi phù hợp, tôi không thấy giải pháp nào phù hợp cho điều này, miễn là người ta không kiểm soát được cách người dùng cuối sử dụng các tập tin Nhưng điều này có thể là mơ tưởng vì một số khách hàng sẽ không hiểu tại sao chúng ta cần phải làm điều này. Trong khi đó, chúng tôi tiếp tục giải thích lý do tại sao đôi khi họ thấy dữ liệu 'sai' trong bảng tính của mình. Cho đến khi Microsoft thực hiện một thay đổi phù hợp, tôi thấy không có giải pháp phù hợp cho vấn đề này, miễn là người ta không kiểm soát được cách người dùng cuối sử dụng các tệp. Nhưng điều này có thể là mơ tưởng vì một số khách hàng sẽ không hiểu tại sao chúng ta cần phải làm điều này. Trong khi đó, chúng tôi tiếp tục giải thích lý do tại sao đôi khi họ thấy dữ liệu 'sai' trong bảng tính của mình. Cho đến khi Microsoft thực hiện một thay đổi phù hợp, tôi thấy không có giải pháp phù hợp cho vấn đề này, miễn là người ta không kiểm soát được cách người dùng cuối sử dụng các tệp.


Nếu một khoảng trống thừa ở bên trái dữ liệu của bạn không thành vấn đề, thì bạn có thể khắc phục các sự cố của Excel bằng cách thêm trước "\xA0"(không phá vỡ không gian) vào dữ liệu của bạn.
Doin

3

Tôi có jus tuần này đi qua hội nghị này, dường như là một cách tiếp cận tuyệt vời, nhưng tôi không thể tìm thấy nó được tham chiếu ở bất cứ đâu. Có ai quen thuộc với nó không? Bạn có thể trích dẫn một nguồn cho nó? Tôi đã không tìm kiếm hàng giờ liền nhưng tôi hy vọng ai đó sẽ nhận ra phương pháp này.

Ví dụ 1: = ("012345678905") hiển thị dưới dạng 012345678905

Ví dụ 2: = ("1954-12-12") hiển thị là 1954-12-12 , không phải 12/12/1954 .


2

Nó không phải là Excel. Windows không nhận ra công thức, dữ liệu là một ngày và tự động. Bạn phải thay đổi cài đặt Windows.

"Bảng điều khiển" (-> "Chuyển sang Chế độ xem cổ điển") -> "Tùy chọn ngôn ngữ và khu vực" -> tab "Tùy chọn khu vực" -> "Tùy chỉnh ..." -> tab "Số" -> Sau đó thay đổi ký hiệu theo những gì bạn muốn

http://www.pcreview.co.uk/forums/enable-disable-auto-convert-number-date-t3791902.html

Nó sẽ hoạt động trên máy tính của bạn, nếu các cài đặt này không được thay đổi, ví dụ như trên máy tính của khách hàng, họ sẽ thấy ngày thay vì dữ liệu.


2

Xin chào tôi có cùng một vấn đề,

Tôi viết vbscipt này để tạo một tệp CSV khác. Tệp CSV mới sẽ có khoảng trắng ở mỗi phông chữ, vì vậy excel sẽ hiểu nó dưới dạng văn bản.

Vì vậy, bạn tạo tệp .vbs với mã bên dưới (ví dụ Modify_CSV.vbs), lưu và đóng tệp. Kéo và thả tệp gốc của bạn vào tệp vbscript của bạn. Nó sẽ tạo một tệp mới với "SPACE_ADDED" để đặt tên tệp trong cùng một vị trí.

Set objArgs = WScript.Arguments

Set objFso = createobject("scripting.filesystemobject")

dim objTextFile
dim arrStr ' an array to hold the text content
dim sLine  ' holding text to write to new file

'Looping through all dropped file
For t = 0 to objArgs.Count - 1
    ' Input Path
    inPath = objFso.GetFile(wscript.arguments.item(t))

    ' OutPut Path
    outPath = replace(inPath, objFso.GetFileName(inPath), left(objFso.GetFileName(inPath), InStrRev(objFso.GetFileName(inPath),".") - 1) & "_SPACE_ADDED.csv")

    ' Read the file
    set objTextFile = objFso.OpenTextFile(inPath)


    'Now Creating the file can overwrite exiting file
    set aNewFile = objFso.CreateTextFile(outPath, True) 
    aNewFile.Close  

    'Open the file to appending data
    set aNewFile = objFso.OpenTextFile(outPath, 8) '2=Open for writing 8 for appending

    ' Reading data and writing it to new file
    Do while NOT objTextFile.AtEndOfStream
        arrStr = split(objTextFile.ReadLine,",")

        sLine = ""  'Clear previous data

        For i=lbound(arrStr) to ubound(arrStr)
            sLine = sLine + " " + arrStr(i) + ","
        Next

        'Writing data to new file
        aNewFile.WriteLine left(sLine, len(sLine)-1) 'Get rid of that extra comma from the loop


    Loop

    'Closing new file
    aNewFile.Close  

Next ' This is for next file

set aNewFile=nothing
set objFso = nothing
set objArgs = nothing

2

Nếu không sửa đổi tệp csv của bạn, bạn có thể:

  1. Thay đổi tùy chọn excel Format Cells thành "text"
  2. Sau đó, sử dụng "Trình hướng dẫn nhập văn bản" để xác định các ô csv.
  3. Sau khi nhập, xóa dữ liệu đó
  4. sau đó chỉ cần dán dưới dạng văn bản đơn giản

excel sẽ định dạng đúng và tách các ô csv của bạn dưới dạng văn bản được định dạng bỏ qua các định dạng ngày tự động.

Một loại công việc ngớ ngẩn xung quanh, nhưng nó đánh bại việc sửa đổi dữ liệu csv trước khi nhập. Andy Baird và Richard đã trốn tránh phương pháp này, nhưng đã bỏ lỡ một vài bước quan trọng.


1

Tôi biết đây là một chủ đề cũ. Đối với những người như tôi, những người vẫn gặp vấn đề này khi sử dụng office 2013 thông qua đối tượng powershell com có ​​thể sử dụng phương thức opentext . Vấn đề là phương pháp này có nhiều đối số, đôi khi là loại trừ lẫn nhau. Để giải quyết vấn đề này, bạn có thể sử dụng phương thức invoke-nameparameter được giới thiệu trong bài viết này . Một ví dụ sẽ là

$ex = New-Object -com "Excel.Application"
$ex.visible = $true
$csv = "path\to\your\csv.csv"
Invoke-NamedParameter ($ex.workbooks) "opentext" @{"filename"=$csv; "Semicolon"= $true}

Thật không may, tôi chỉ phát hiện ra rằng phương pháp này bằng cách nào đó phá vỡ phân tích csv khi các ô chứa ngắt dòng. Điều này được hỗ trợ bởi csv nhưng việc triển khai microsofts dường như bị lỗi. Ngoài ra nó bằng cách nào đó đã không phát hiện ra ký tự cụ thể của Đức. Cho nó văn hóa chính xác đã không thay đổi hành vi này. Tất cả các tệp (csv và script) được lưu với mã hóa utf8. Đầu tiên tôi viết đoạn mã sau để chèn ô csv theo ô.

$ex = New-Object -com "Excel.Application"
$ex.visible = $true;
$csv = "path\to\your\csv.csv";
$ex.workbooks.add();
$ex.activeWorkbook.activeSheet.Cells.NumberFormat = "@";
$data = import-csv $csv -encoding utf8 -delimiter ";"; 
$row = 1; 
$data | %{ $obj = $_; $col = 1; $_.psobject.properties.Name |%{if($row -eq1){$ex.ActiveWorkbook.activeSheet.Cells.item($row,$col).Value2= $_ };$ex.ActiveWorkbook.activeSheet.Cells.item($row+1,$col).Value2 =$obj.$_; $col++ }; $row++;}

Nhưng điều này là cực kỳ chậm, đó là lý do tại sao tôi tìm kiếm một sự thay thế. Xuất hiện Excel cho phép bạn đặt các giá trị của một phạm vi ô với ma trận. Vì vậy, tôi đã sử dụng thuật toán trong blog này để biến đổi csv trong multiarray.

function csvToExcel($csv,$delimiter){
     $a = New-Object -com "Excel.Application"
     $a.visible = $true

    $a.workbooks.add()
     $a.activeWorkbook.activeSheet.Cells.NumberFormat = "@"
     $data = import-csv -delimiter $delimiter $csv; 
     $array = ($data |ConvertTo-MultiArray).Value
     $starta = [int][char]'a' - 1
     if ($array.GetLength(1) -gt 26) {
         $col = [char]([int][math]::Floor($array.GetLength(1)/26) + $starta) + [char](($array.GetLength(1)%26) + $Starta)
     } else {
         $col = [char]($array.GetLength(1) + $starta)
     }
     $range = $a.activeWorkbook.activeSheet.Range("a1:"+$col+""+$array.GetLength(0))
     $range.value2 = $array;
     $range.Columns.AutoFit();
     $range.Rows.AutoFit();
     $range.Cells.HorizontalAlignment = -4131
     $range.Cells.VerticalAlignment = -4160
}

 function ConvertTo-MultiArray {
     param(
         [Parameter(Mandatory=$true, Position=1, ValueFromPipeline=$true)]
         [PSObject[]]$InputObject
     )
     BEGIN {
         $objects = @()
         [ref]$array = [ref]$null
     }
     Process {
         $objects += $InputObject
     }
     END {
         $properties = $objects[0].psobject.properties |%{$_.name}
         $array.Value = New-Object 'object[,]' ($objects.Count+1),$properties.count
         # i = row and j = column
         $j = 0
         $properties |%{
             $array.Value[0,$j] = $_.tostring()
             $j++
         }
         $i = 1
         $objects |% {
             $item = $_
             $j = 0
             $properties | % {
                 if ($item.($_) -eq $null) {
                     $array.value[$i,$j] = ""
                 }
                 else {
                     $array.value[$i,$j] = $item.($_).tostring()
                 }
                 $j++
             }
             $i++
         }
         $array
     } 
} 
csvToExcel "storage_stats.csv" ";"

Bạn có thể sử dụng mã ở trên vì nó sẽ chuyển đổi bất kỳ csvs nào thành excel. Chỉ cần thay đổi đường dẫn đến csv và ký tự phân cách ở phía dưới.


quá phức tạp
cuộn

1

Trong trường hợp của tôi, "Sept8" trong tệp csv được tạo bằng R đã được chuyển đổi thành "8 tháng 9" bởi Excel 2013. Vấn đề đã được giải quyết bằng cách sử dụng hàm write.xlsx2 () trong gói xlsx để tạo tệp đầu ra ở định dạng xlsx , có thể được tải bởi Excel mà không cần chuyển đổi không mong muốn. Vì vậy, nếu bạn được cấp một tệp csv, bạn có thể thử tải nó vào R và chuyển đổi nó thành xlsx bằng hàm write.xlsx2 ().


Tôi không biết tại sao câu trả lời của bạn bị hạ thấp. Nó rất hữu ích cho những người ít nhất đang sử dụng R. Câu trả lời này đã giúp tôi. Cảm ơn :)
sriharsha KB

1

Cách giải quyết bằng Google Drive (hoặc Số nếu bạn đang sử dụng máy Mac):

  1. Mở dữ liệu trong Excel
  2. Đặt định dạng của cột có dữ liệu không chính xác thành Văn bản (Định dạng> Ô> Số> Văn bản)
  3. Tải .csv vào Google Drive và mở bằng Google Sheets
  4. Sao chép cột vi phạm
  5. Dán cột vào Excel dưới dạng Văn bản (Chỉnh sửa> Dán Đặc biệt> Văn bản)

Ngoài ra, nếu bạn đang dùng Mac cho bước 3, bạn có thể mở dữ liệu bằng Số.


Đây là một giải pháp lành mạnh hơn là làm việc trên nó hàng giờ mà không có bất kỳ giải pháp nào.
imsrgadich

1

(EXCEL 2016 trở lên, thực sự tôi chưa thử trong các phiên bản cũ hơn)

  1. Mở trang trống mới
  2. Chuyển đến tab "Dữ liệu"
  3. Nhấp vào "Từ Văn bản / CSV" và chọn tệp csv của bạn
  4. Kiểm tra xem trước liệu dữ liệu của bạn là chính xác.
  5. Trong mục khi một số cột được chuyển đổi thành ngày, nhấp vào "chỉnh sửa" và sau đó chọn loại Văn bản bằng cách nhấp vào lịch ở đầu cột
  6. Nhấp vào "Đóng & Tải"

0

Được rồi, tìm thấy một cách đơn giản để làm điều này trong Excel 2003 đến năm 2007 Mở một sổ làm việc xls trống. Sau đó vào menu Dữ liệu, nhập dữ liệu ngoài. Chọn tập tin csv của bạn. Đi qua trình hướng dẫn và sau đó trong "định dạng dữ liệu cột", chọn bất kỳ cột nào cần phải "văn bản". Điều này sẽ nhập toàn bộ cột đó dưới dạng định dạng văn bản ngăn Excel cố gắng coi bất kỳ ô cụ thể nào là một ngày.


0

Vấn đề này vẫn còn hiện diện trong Mac Office 2011 và Office 2013, tôi không thể ngăn chặn nó xảy ra. Có vẻ như một điều cơ bản.

Trong trường hợp của tôi, tôi đã có các giá trị như "1 - 2" & "7 - 12" trong CSV được đính kèm chính xác trong dấu phẩy đảo ngược, điều này sẽ tự động chuyển thành một ngày trong excel, nếu sau đó bạn thử chuyển đổi nó thành văn bản đơn giản bạn sẽ nhận được một đại diện số của ngày, chẳng hạn như 43768. Ngoài ra, nó định dạng lại số lượng lớn được tìm thấy trong mã vạch và số EAN thành số 123E + một lần nữa mà không thể chuyển đổi lại.

Tôi đã thấy rằng Google Sheets của Google Drive không chuyển đổi số thành ngày. Mã vạch có dấu phẩy trong mỗi 3 ký tự nhưng chúng dễ dàng bị xóa. Nó xử lý CSV thực sự tốt đặc biệt là khi giao dịch với MAC / Windows CSV.

Thỉnh thoảng có thể cứu ai đó.


0

GIẢI PHÁP DỄ DÀNG Tôi chỉ cần tìm ra điều này ngày hôm nay.

  • Mở trong Word
  • Thay thế tất cả các dấu gạch ngang bằng dấu gạch ngang
  • Lưu và Đóng
  • Mở trong Excel

Khi bạn chỉnh sửa xong, bạn luôn có thể mở lại nó trong Word để thay thế dấu gạch ngang bằng dấu gạch nối một lần nữa.


0

Tôi làm điều này cho các số thẻ tín dụng tiếp tục chuyển đổi sang ký hiệu khoa học: Tôi cuối cùng đã nhập .csv của mình vào Google Sheets. Các tùy chọn nhập hiện cho phép vô hiệu hóa định dạng tự động của các giá trị số. Tôi đặt bất kỳ cột nhạy cảm nào thành Văn bản thuần túy và tải xuống dưới dạng xlsx.

Đó là một quy trình công việc tồi tệ, nhưng ít nhất các giá trị của tôi vẫn được giữ nguyên.


Nếu bạn bận tâm đọc qua một số câu trả lời khác, bạn sẽ thấy rằng ai đó đã gợi ý điều này ở đây .
Vòng nguyệt quế

Tôi đã làm phiền, cảm ơn bạn. Tôi gợi ý lựa chọn định dạng tự động là một phần mới của quy trình nhập. Câu trả lời của tôi cung cấp một quy trình làm việc rất cụ thể, cho những người, giống như tôi, đã buộc phải sử dụng Sheets để giải quyết vấn đề cụ thể này. Trong tâm trí của tôi, điều này đáng khen một câu trả lời riêng biệt. Một sự điều chỉnh nhỏ về giọng điệu của bạn thực sự có thể dẫn đến nhận xét của bạn được hiểu là hữu ích, đó là toàn bộ quan điểm của dòng trang web này.
Brendonwbrown

Nhưng bạn chỉ có thể sử dụng Nhập văn bản trong Excel để nhập tệp CSV và không bận tâm với Trang tính, như đã lưu ý trong các câu trả lời khác.
NetMage

0

Tôi đã tạo macro vba này về cơ bản định dạng phạm vi đầu ra dưới dạng văn bản trước khi dán các số. Hoạt động hoàn hảo đối với tôi khi tôi muốn dán các giá trị như 8/11, 23/6, 1/3, v.v. mà không cần Excel diễn giải chúng là ngày.

Sub PasteAsText()
' Created by Lars-Erik Sørbotten, 2017-09-17
Call CreateSheetBackup

Columns(ActiveCell.Column).NumberFormat = "@"

Dim DataObj As MSForms.DataObject
Set DataObj = New MSForms.DataObject
DataObj.GetFromClipboard

ActiveCell.PasteSpecial

End Sub

Tôi rất quan tâm đến việc biết điều này có hiệu quả với người khác không. Tôi đã tìm kiếm một giải pháp cho vấn đề này trong một thời gian, nhưng tôi chưa thấy một giải pháp vba nhanh nào cho nó trước đó mà không bao gồm việc chèn 'vào trước văn bản đầu vào. Mã này giữ lại dữ liệu ở dạng ban đầu.


-1

Nếu bạn đặt dấu phẩy đảo ngược ở đầu trường, nó sẽ được hiểu là văn bản.

Ví dụ: 25/12/2008trở thành'25/12/2008

Bạn cũng có thể chọn loại trường khi nhập.


9
Tôi không muốn một 'ở đầu dữ liệu của tôi.

27
-1. 'Chỉ hoạt động khi được nhập trực tiếp vào excel, nhưng nó không hoạt động trong CSV - bạn sẽ có thêm ký tự' trong ô excel sau khi nhập.
TMS

-1

Một phương pháp thay thế:

Chuyển đổi định dạng của cột bạn muốn thay đổi thành 'Văn bản'. Chọn tất cả các ô bạn muốn bảo tồn, sao chép. Không bỏ chọn các cột đó, nhấp vào "Chỉnh sửa> Dán Đặc biệt> Dưới dạng giá trị"

Lưu dưới dạng CSV. Lưu ý rằng đây phải là điều cuối cùng bạn làm với tệp vì khi bạn mở lại, nó sẽ tự định dạng dưới dạng ngày vì các định dạng ô không thể được lưu trong tệp CSV.

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.