Excel'in nefis CSV dosyalarımı yemesini ve gereksiz verileri atmasını nasıl durdurabilirim?


128

Widget satışlarını seri numarasına göre izleyen bir veritabanım var. Kullanıcılar, alıcı verilerini ve miktarını girerek her widget'ı özel bir istemci programına tarayın. Daha sonra siparişi kesinleştirir. Bunların hepsi kusursuz çalışıyor.

Bazı müşteriler, satın aldıkları widget'ların Excel uyumlu bir elektronik tablosunu ister. Bunu veritabanını sorgulayan ve sonucu mağaza adı ve ilgili verilerle CSV olarak çıkaran bir PHP betiği ile üretiyoruz. Bu da mükemmel çalışıyor.

Notepad veya vi gibi bir metin düzenleyicide açıldığında, dosya şöyle görünür:

"Account Number","Store Name","S1","S2","S3","Widget Type","Date"
"4173","SpeedyCorp","268435459705526269","","268435459705526269","848 Model Widget","2011-01-17"

Görebileceğiniz gibi, seri numaraları vardır (bu durumda iki kez, tüm ikincil diziler aynı değildir) ve uzun sayı dizileridir. Bu dosya Excel'de açıldığında, sonuç şöyle olur:

Account Number  Store Name  S1  S2  S3  Widget Type Date 
4173    SpeedyCorp  2.68435E+17     2.68435E+17 848 Model Widget    2011-01-17

Gördüğünüz gibi, seri numaraları çift tırnak işareti içine alınır. Excel, .csv dosyalarındaki metin niteleyicilere saygı duymuyor gibi görünüyor. Bu dosyaları Access'e içe aktarırken sıfır zorluk yaşıyoruz. Onları metin olarak açarken, hiçbir sorun yok. Ancak Excel, başarısız olmadan bu dosyaları işe yaramaz çöplere dönüştürür. Son kullanıcılara, varsayılan olmayan bir uygulama ile bir CSV dosyası açma sanatı konusunda talimat vermeye çalışmak, yorucu olduğunu söylüyor. Umut var mı Bulamadığım bir ayar var mı? Excel 2003, 2007 ve 2010'da durum böyle görünüyor.


46
sadece isim için bir +1 verebilir miyim?
tombull89

11
Excel does not seem to respect text qualifiers in .csv files- çift tırnak, metin niteleyici değildir , verilerinizde virgül kullanmazsanız, verilerinizde virgüllere izin verir, o zaman anlamsızdırlar . Bir CSV dosyasındaki tüm veriler yazılmamıştır, bu nedenle Excel yalnızca büyük seri numaranızın bir sayı olduğunu tahmin edebilir ve bu, Excel'in sayılarını kısaltan 15 basamaklı maksimum hassasiyetine rastladığınız zamandır.
DMA57361,

1
Excel, çift tırnak içindeki tüm virgüllere saygı duymuyor gibi görünüyor. "12 Ağustos 2012" düşünün, Excel bunu da çöpe dönüştürür.
zundarz

5
Bu SU sorusundan bahsetmek istiyorum . Excel'de CSV ile çalışırken hangi seçeneklere sahip olduğunuzu açıklar.
nixda

1
@ nixda Teşekkürler! Bunlar, özellikle daha deneyimli kullanıcılar için faydalı önerilerdir. Benim sorunum neredeyse bir insan sorunudur, çünkü Excel kendini .csv dosyalarıyla ilişkilendirir ve insanlar simgeyi görür ve çift tıklatır (çünkü bu şekilde bir şeyi açarsınız) ve sonra genellikle Kaydet'e basın (çünkü her zaman söylediğimiz gibi) Onları Kurtar!) ve hepsi kaybolur. Ama yöntemlerinizi kesinlikle mümkün olduğunda kullanacağım.
atroon

Yanıtlar:


58

Ancak Excel, başarısız olmadan bu dosyaları işe yaramaz çöplere dönüştürür.

Excel işe yaramaz bir çöptür.

Çözüm

Verilerinizi bir Excel biçiminde isteyen herhangi bir müşteri, bu üç sütundaki görünen biçimlendirmeyi sıfır ondalık basamaklı "Sayı" ya da "metin" olarak değiştiremediğinde biraz şaşırırdım. Ancak, kısa bir nasıl yapılır belgesinin söz konusu olmadığını varsayalım.

Seçenekleriniz:

  1. Sayısal olmayan bir boşluk karakterini seri numaralarınıza atın.
  2. Varsayılan bir biçimlendirme ile bir xls dosyası veya xlsx dosyası yazın.
  3. Bu sayıları aldatma ve çıktı formülleri ="268435459705526269","",="268435459705526269"( ="268435459705526269",,="268435459705526269"kendiniz 2 karakter kaydetmeyi de yapabilirsiniz ). Bu, doğru görüntüleme ve büyük olasılıkla genel olarak faydalı olma, ancak ustaca kırılma (formüller olduğu gibi) avantajına sahiptir.

Seçenek 3'e dikkat edin, çünkü bazı programlar (Excel ve Open Office Calc dahil), artık virgüllerdeki =""alanlara virgülle kaçmaz. Bu, ="abc,xyz"iki sütuna yayılacak ve içe aktarımı kıracak demektir .

"=""abc,xy"""Bu sorunu çözme biçimini kullanarak , ancak bu yöntem Excel'in formül uzunluğu sınırı nedeniyle sizi 255 karakterle sınırlandırır.


1
Aslında, bu zor olmuyor. Yukarıdaki sayılardan birini kopyalayıp Excel'e yapıştırın, ardından sayı biçimini önerilen şekilde değiştirin. Excel değeri değiştirerek çöplerle sonuçlanır.
Joe Internet

1
@Joe, ilk bakışım konusunda çok cüretkendim. Excel gerçekten çöp üretiyor ve kendisi de çöp. Bunu yansıtacak şekilde cevabımı güncelledim. Bir seçenek "Excel csv" ye sahip olabilir ve ayrıca "kullanışlı, değerli csv" ye sahip olabilir
Tyler

2
@Tyler - Excel'in çöp olduğunu sanmıyorum, sadece OP'nin bu durumda çöp ürettiğinin doğru olduğunu söyleyerek. Görünüşe göre zarif bir çözümü olmayan, aslında çok iyi bir soru.
Joe Internet

1
Hücreleri Biçimlendir ... seçeneği önerildi ve kullanmaya çalıştım. Bu durumda, dosyayı açtığınız anda, Excel, dizelleri Bilimsel notasyona dönüştürür (anlaşılır, beklenmeyen değil) ve kesinliği artırır. Onları bir sayıya veya metne değiştirdiğinizde, dize geri gelmez. Bu gerçekten sorunun özüdür. Formül olarak çıktı almak, bunu yapabilir ... Bunu düşünmedim.
atroon

9
@ DMA57361 Davranış beklenmiyor, belirlenebilir. Sayısal hassasiyet iyi belgelenmiştir, excel'in CSV'leri nasıl okuduğunu gösterir. Uyarı ve sessizce veri atma eksikliği saçmadır. Excel'e verilerin nasıl alınacağını bile söyleyememeniz aynı derecede saçmadır. Olumsuzluk gerekli mi? Hayır, ama dürüstlük en iyi politika ve ben de böyle hissediyorum.
Tyler,

42

3-5 ve Excel gibi aralıkları içeren sütunlara sahip CSV dosyalarımızın olduğu durumlarda bunları sık sık tarihlere çevirirdik, örn. 3-5 Mar, 3'ten sonra, nümerik değere geri dönmek bize işe yaramaz bir tamsayı verdi. Etrafından dolandık

  1. CSV’yi TXT uzantısına yeniden adlandırma
  2. Sonra Excel'de açtığımızda, bu metin içe aktarma sihirbazında başlar
  3. Sihirbazın 3 / 3'ünde söz konusu sütunların metin olduğunu ve düzgün bir şekilde içe aktarıldığını söyledik .

Burada da aynısını yapabilirsin sanırım.

metin içe aktarma sihirbazı

Şerefe


2
Doğru yapmak için +1. (düzenleme: üzgünüm çözümü netleştirmek için biraz düzenlemek zorunda kaldı)
jay

2
Dosyanızı yeniden adlandırmanız gerekmez. Sadece içe aktarma sihirbazını kullanın Tüm sütunları Shift-seçin ve metin olarak seçin.
nixda

1
Metin Alma Sihirbazı cevaptır. Diğer tüm çözümler, CSV'leri görüntülemek ve düzenlemek için Excel'in nasıl kullanılacağının anlaşılmamasından kaynaklanan gereksiz korsanlıktır.
Excellll

1
@Excellll, her seferinde bir dosya olduğundan emin olun. Bu işlemi otomatize ederken, 'gereksiz korsanlık' genellikle günü kurtarır.
Parrish Koca

1
excel standart kullanıcılar tarafından CSV dosyalarını görüntülemek için kullanıldığında bu tamamen yararsızdır. text-import-wizard'ın ~ 15 acemi uzmanı ofis kullanıcıları için nasıl kullanılacağını açıklamaya çalışmadan önce, excel belge kaynak kodunu kendim yazmayı tercih ederim.
northkildonan

8

Daha iyi bir çözüm, XML Çalışma Kitabı oluşturmaktır. Bunun gibi, böyle:

<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
  </OfficeDocumentSettings>

  <ss:Worksheet ss:Name="Sheet 1">
    <Table>
    <Column ss:Width="100"/>
    <Column ss:Width="100"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="80"/>
    <Column/>

    <Row>
      <Cell><Data ss:Type="String">Account Number</Data></Cell>
      <Cell><Data ss:Type="String">Store Name</Data></Cell>
      <Cell><Data ss:Type="String">S1</Data></Cell>
      <Cell><Data ss:Type="String">S2</Data></Cell>
      <Cell><Data ss:Type="String">S3</Data></Cell>
      <Cell><Data ss:Type="String">Widget Type</Data></Cell>
      <Cell><Data ss:Type="String">Date</Data></Cell>
    </Row>

    <Row>
      <Cell><Data ss:Type="String">4173</Data></Cell>
      <Cell><Data ss:Type="String">SpeedyCorp</Data></Cell>
      <Cell><Data ss:Type="String">268435459705526269</Data></Cell>
      <Cell><Data ss:Type="String">x</Data></Cell>
      <Cell><Data ss:Type="String">268435459705526269</Data></Cell>
      <Cell><Data ss:Type="String">848 Model Widget</Data></Cell>
      <Cell><Data ss:Type="String">2011-01-17</Data></Cell>
    </Row>


    </Table>
    <x:WorksheetOptions/>
  </ss:Worksheet>
</Workbook>

Dosya, .xml uzantılı olmalıdır. Excel ve OpenOffice doğru şekilde açın.


OP'nin veritabanını XML formatına dönüştürmek için PHP betiği kullanması gerektiği anlamına mı geliyor?
Prasanna

2
Kullanıcıların Excel'de .csv dosyasını açmasını veya CSV'nizi karıştırmasını, böylece yalnızca Excel'in CSV'nizi anlamasını sağlamaktan çok daha temiz. Bir şemanın kompleksi bile değil.
binki

Bu standart nerede belgelenmiştir? Kullanılabilir veri türleri hakkında daha fazla bilgi edinmek istiyorum.
John Doherty,

1

Benim çözümüm: Seri numaralarını alırken de aynı sorunu yaşıyorum. Sayılar olarak ele alınmaları gerekmez, yani üzerinde hiçbir matematiksel işlev yoktur, ama oradaki tüm sayıya ihtiyacımız var. Sahip olduğum en basit şey seri numarasına bir boşluk koymak. örneğin "12345678 90123456 1234". Excel onu içe aktardığında, sayı yerine metin olarak değerlendirilir.


0

Uzun hesap numaralarım boğuldu.

Bu nasıl düzelttim:

File.csv dosyanızı Libre Office / Open Office'de açın (sınırlayıcıları vs. belirtmeniz gerekebilir), ardından dosyayı bir Excel XML dosyası olarak kaydedin.

Daha sonra bu dosyayı Excel'de açın ve sütunların artık bilimsel formatta veya her neyse değişmediğini göreceksiniz. Güvenli olmak için sütuna sağ tıklayın ve formatı açıkça Metin olarak ayarlayın, ardından Excel dosyası olarak kaydedin.

Excel biçiminde dosyayı açın ve sütun hala iyi olmalı!


1
Bu olsa olurdu çalışmak, o farklı bir ofis paketi kullanmak gerekir neden sadece İngilizce kırık konuşuyor birine açıklamaya çalışırken o çözer kadar pek çok sorun yaratır. M $ Office'e alternatif bir yazılım tamamen benim görüşüme göre iyi, ama ben herkesi dönüştüremediğimin farkındayım.
atroon

0

Alma Sihirbazı sıradan kullanıcılar ve bir defalık durumlar için en iyi çözümdür. Programlı bir çözüme ihtiyacınız varsa, QueryTables.Add yöntemini (İçe Aktarma Sihirbazı'nın sahne arkasında kullandığı yöntem) kullanabilirsiniz.

Workbooks.Add
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & "C:\myfile.csv", Destination:=Range("$A$1"))
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 437
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = True
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 2, 2) 'Edit this line. Add a number for each column, 1 is general, 2 is text. Search the internet for other formats.
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
End With
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.