Memformat CSV yang dibatasi koma untuk memaksa Excel menafsirkan nilai sebagai string


64

Saya telah mencari-cari sebentar sambil mencoba mencari cara untuk menghasilkan file CSV sedemikian rupa untuk memaksa Excel untuk menafsirkan nilai sebagai string dan tidak mencoba untuk mengubahnya menjadi angka atau tanggal.

misalnya:

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

Excel mencoba untuk "secara cerdas" mengonversi semua ini ke format tanggal / angka aslinya. Apakah ada jalan keluarnya?


EDIT: Klarifikasi maksud pertanyaan saya, maaf atas kebingungan.

Jawaban:


67

Bagi mereka yang memiliki kendali atas data sumber, tampaknya Excel akan secara otomatis mendeteksi format bidang CSV kecuali kolom CSV dalam format ini:

"=""Data Here"""

misalnya...

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

Ini juga berfungsi di Google Spreadsheet, tetapi tidak yakin apakah aplikasi spreadsheet lain mendukung notasi ini.

Jika Anda mencurigai ada data yang mengandung kutipan itu sendiri, Anda perlu melarikan diri dua kali lipat , seperti ini ...

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



(EDIT: Diperbarui dengan koreksi, terima kasih DMA57361!)


Luar biasa, kita hanya perlu mengubah data .. sigh
Pricey

4
Kolom terakhir itu seharusnya "=""123"""tidak terbentuk dengan buruk. Fields yang mengandung a "harus dibatasi dan "s di field tersebut lolos dengan "s lainnya .
DMA57361

@ DMA57361 sebenarnya cara dia baik-baik saja, itu adalah dua bidang lain di sampingnya yang tidak memiliki tanda sama dengan yang ditulis sebelumnya. Apa yang dia taruh di sana adalah mengatur formula sel itu untuk mengembalikan sebuah string. Untuk menghindari ini, Anda dapat mengatur tipe data sel ke "Teks".
Terobosan

2
@Breakthrough tabel itu ada mewakili file CSV, bukan bidang Excel. Nilai terakhir ="123"bukan bidang CSV yang valid karena berisi karakter pembatas bidang " tanpa benar - benar membatasi atau bidang. Faktanya Excel kebetulan membacanya sebagai rumus murni terserah Excel dan tidak ada hubungannya dengan file CSV.
DMA57361

2
@PriceChild, inti dari pertanyaan awal saya (yang tidak saya jelaskan dengan sangat baik) sebenarnya adalah bagaimana memformat CSV agar semudah mungkin bagi pengguna. Jadi inilah jawaban yang saya temukan dan ingin saya posting. DMA57361 sebenarnya membawa koreksi yang bermanfaat juga, terima kasih!
Simon East

36

Seperti banyak orang, saya telah berjuang dengan keputusan yang sama yang dibuat Microsoft dan mencoba berbagai solusi yang disarankan.

Untuk Excel 2007 berikut ini terjadi:

  • Menempatkan semua nilai dalam tanda kutip ganda TIDAK membantu
  • Menempatkan = sebelum semua nilai setelah menempatkannya dalam double quutes BUKAN bantuan, TETAPI membuat file csv tidak berguna untuk sebagian besar aplikasi lain
  • Menempatkan tanda kurung di sekitar tanda kutip ganda di sekitar semua nilai adalah sampah
  • Menempatkan spasi di depan semua nilai sebelum menempatkan tanda kutip ganda di sekitarnya TIDAK mencegah konversi ke tanggal, tetapi TIDAK mencegah pemangkasan memimpin atau mengekor nol.
  • Menempatkan kutipan tunggal di depan nilai hanya berfungsi saat memasukkan data dalam Excel.

Namun:

Menempatkan tab di depan semua nilai sebelum menempatkan tanda kutip ganda di sekitarnya TIDAK MEMBUAT konversi ke tanggal DAN TIDAK mencegah pemangkasan dari nol mengarah atau tertinggal dan lembar bahkan tidak menunjukkan spidol peringatan buruk di sudut kiri atas setiap sel.

Misalnya:

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

Perhatikan bahwa karakter tab harus berada dalam tanda kutip ganda. Sunting: ternyata tanda kutip ganda bahkan tidak perlu.

Mengklik ganda file csv dapat membuka file sebagai spreadsheet di Excel yang menunjukkan semua nilai yang diperlakukan seperti di atas, seperti data teks. Pastikan untuk mengatur Excel untuk menggunakan '.' sebagai titik desimal dan bukan ',' atau setiap baris dari file csv akan berakhir sebagai satu teks di sel pertama dari setiap baris. Rupanya Microsoft berpikir bahwa CSV berarti "Bukan titik desimal" Nilai Terpisah.


Trik tab ini menyelamatkan hari saya, Excel mengubah nilai numerik yang sangat panjang menjadi angka, dan kehilangan semua digit setelah tanggal 15. Berhasil mendapatkan Excel untuk memperlakukannya sebagai teks dengan awalan tab. Jadi bekerja untuk angka juga, bukan hanya kencan.
Markus Yrjölä

Ini sangat berguna, terima kasih!
Flavio

22

Menggunakan fungsi impor Excel memungkinkan Anda untuk menentukan format (otomatis, teks atau tanggal) setiap kolom harus ditafsirkan sebagai dan tidak memerlukan modifikasi apa pun pada file data.

Anda dapat menemukannya sebagai DataGet External DataFrom Textdi Excel 2007/2010.
Atau DataImport External DataImport Datadi Excel 2003.

Berikut adalah gambar dari Panduan Impor Teks Excel 2003 beraksi pada contoh data yang diberikan, menunjukkan kepada saya mengimpor dua kolom terakhir sebagai teks:

Excel 2003: Panduan Impor Teks pada Langkah 3 - tipe data


Jawaban yang sangat baik DMA57361, terima kasih untuk semua detailnya. Apa yang sebenarnya tidak saya sebutkan dalam pertanyaan saya adalah bahwa saya menulis skrip yang mengekspor data ke Excel, jadi saya berusaha mencegah pengguna dari harus melompati opsi membingungkan seperti ini. Tapi tetap memilihmu. :-)
Simon East

@Simon, kamu sedang menulis skrip apa? Bagaimana Anda bisa mendapatkannya untuk menghasilkan file Excel yang sebenarnya secara langsung, alih-alih melalui format perantara?
DMA57361

skrip PHP yang mengekspor tabel database. CSV mungkin yang paling mudah untuk dikerjakan, tetapi Anda benar, saya mungkin bisa menghasilkan XLS dengan bantuan beberapa kode sumber terbuka, atau bahkan hanya tabel HTML yang menurut saya dari pengalaman sebelumnya menghasilkan hasil yang wajar di Excel (memungkinkan warna & pemformatan dll., tetapi tidak yakin tentang tipe data).
Simon East

1
Ada beberapa pertanyaan tentang SO tentang PHP → Excel, beberapa pertanyaan pertama yang saya coba semua memiliki jawaban yang menunjuk ke PHP Excel , sehingga mungkin patut dilihat.
DMA57361

itu sangat membantu, setelah membaca beberapa
jawaban

1

Contoh dari Simon tidak bekerja untuk saya, dan saya kira itu perbedaan bahasa. Di C # di sini adalah tampilan string format kerja saya:

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);

dan seperti inilah tampilan file output:

="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,=""

Seperti dapat dilihat, format dalam file output ="VALUE",bukan "=""VALUE""",yang saya percaya mungkin merupakan konvensi Visual Basic.

Saya menggunakan Excel 2010. Kebetulan, Google Sheets tidak akan membuka / mengonversi file yang diformat dengan cara ini. Ini akan berfungsi jika Anda menghapus tanda sama dengan itu "VALUE",- Excel masih akan membuka file tetapi mengabaikan fakta bahwa Anda ingin kolom Anda menjadi string.


-2

Cara sederhana untuk memaksa Excel menafsirkan tanggal sebagai teks adalah dengan menempatkan tanda kutip tunggal di depan tanggal, alih-alih menggunakan kutipan penuh, seperti pada:

'10 / 11/2002

Jika Anda dapat mengimpor CSV alih-alih membukanya, Anda dapat memberi tahu Excel format apa yang harus dimiliki setiap kolom. Lihatlah pertanyaan yang saya ajukan ini .


5
Diturunkan karena ini TIDAK berfungsi dalam file CSV yang diimpor ke Excel. Excel menafsirkan kutipan sebagai kutipan literal dan karenanya menunjukkannya dalam sel.
psynnott
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.