2009-10-10 23 views
11

'da CSV olarak verilen Excel dosyasını ayrıştırılamıyor Bazı CSV'leri ayrıştırmak için Ruby's CSV kitaplığını kullanıyorum. Bir Excel dosyasını CSV olarak dışa aktararak oluşturduğum oldukça iyi oluşturulmuş bir CSV dosyasına sahibim. Ancak, CSV.open(filename, 'r'), CSV::IllegalFormatError neden olur.Ruby: OS X

Dosyada hileli virgül veya tırnak işareti bulunmuyor ya da sorunlara neden olabilecek başka bir şey göremiyorum.

Sorun, satır sonlarıyla ilgili olabileceğinden şüpheleniyorum. Bir metin editörü (Aquamacs) aracılığıyla manuel olarak girilen verileri ayrıştırabiliyorum. Sadece Excel'den (OS X için) dışa aktarılan verilerle karşılaştığımda sorunların ortaya çıkması. Dışa aktarılan CSV'yi vim'de açtığımda, tüm metinler satırlar arasında görünen ^M ile bir satırda görüntülenir.

Belgelerden, bir satır ayırıcısıyla open sağlayabildiğiniz anlaşılıyor; ancak bu durumda ne olması gerektiği konusunda emin değilim.

cevap

35

Dene: CSV.open('filename', 'r', ?,, ?\r)

cantlin gibi notlar, Ruby 2 için bu kadar:

CSV.new('file.csv', 'r', :col_sep => ?,, :row_sep => ?\r) 

Bunları sizin için DTRT eminim. :%s/\r/\r/g

Evet, komut toplam no-op gibi göründüğünü biliyorum ama işe yarayacak: Ayrıca aşağıdaki vim komutla dosyayı kendisi (bu durumda eski open tutmak) "düzeltmek" olabilir. Ben vim ihraç CSV açtığında

+0

çok teşekkürler - iki yararlı bilgi parçası için sizi iki kez ayırabilirdim. – grifaton

+0

Ne '? ,,? \ R' ne yapıyor açıklayabilir misiniz? Teşekkürler! –

+0

? X karakter x, yani bir sayı için kod noktasını döndürür. Bazı nedenlerden dolayı, CSV.open'in görmeyi beklediği şey budur. Bu yüzden alan ayırıcıyı ',' ve kayıt ayırıcıyı, aksi halde sorunlu olanı^M, 015, aka 13, CR olarak seçtik. BTW, vim replasman komutu çalışır, çünkü '' r '' desende CR 'dir, ancak yer değiştirmede NL' dir, bu aslında bir no-op değildir. – DigitalRoss

0

""" , tüm metin^M satır aralarını azalmasıyla, bir satırda görünüyor. Dokümanlar

, size bir açık sağlayabilir görünüyor satır ayırıcı, ancak bu durumda ne olması gerektiğinden emin değilim "" "

Bir cümle geri oku ...^M klavye Ctrl-M aka '\ x0D' anlamına gelir (M, 13) ASCII alfabe; 0x0D == 13) aka ASCII CR (satır başı) aka '\ r' ... IOW, Mac OS'den önce bir satır sonlandırıcı olarak kullanılır.

4

Başka bir seçenek, CSV dosyasını veya orijinal elektronik tabloyu Excel'de açmak ve "Virgülle Ayrılmış Değerler" yerine "Windows Virgülle Ayrılmış" olarak kaydetmek. Bu, dosyayı FasterCSV'nin anlayabileceği satır sonlarıyla çıkarır.

+0

Bu konuda bir saat israf etti, bir ton teşekkürler! – Joelio

5

soyma \ r karakterleri CSV ayrıştırıcı ve/veya sorunları olmadan DOS/Windows satır sonları okuma kullanan herhangi bileşeninin yeni sürümlerini görünüyor bana

CSV.parse(File.read('filename').gsub(/\r/, ' ')) do |row| 
    ... 
end 
0

için çalışmak gibiydi. Mac OS X'in stok bir (sürümden emin değil), kesmek değildi, Ruby 2.0.0 yüklü ve özel argümanlar olmadan dosyayı, sadece ince ayrıştırdı ...

0

Benzer bir sorun vardı.

"error_message"=>"Illegal quoting in line 1.", "error_class"=>"CSV::MalformedCSVError" 

sorun dosyası Unix dışındaki elbette, Windows satır sonları, vardı: Ben bir hata var.Bana yardımcı olan şey, row_sep'i tanımlamaktı: "\ r \ n":

CSV.open(path, 'w', headers: :first_row, col_sep: ';', quote_char: '"', row_sep: "\r\n")