2012-02-10 20 views
8

Ayrıştırmak istediğim bir CSV dosyası yığını var - sorun, alıntı işaretleri olarak kullanılan tırnak işaretlerinin yarısı ve ana alanın içindeki virgüllerin yarısıdır. Gerçekten CSV değiller, ancak tanımlanabilir sabit sayıda alan var. lehçesi = csv. ayar alanının içinde, karakter "ekstra dışarı dosyalar üzerinde mükemmel çalışıyor ve "excel".İçindekilerle birlikte alıntı ve virgülle birlikte CSV dosyaları

Bu veriler desteklenmeyen/eskidir. Bu konuda biraz hayat itmeye çalışıyorum.

örneğin

"AAAAA 
AAAA 
AAAA 
AAAA","AAAAAAAA 


AAAAAA 
AAAAA "AAAAAA" AAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAA, AAAAA 
AAAAAAAAA AAAAA AAAAAAAAAA 
AAAAA, "AAAAA", AAAAAAAAA 
AAAAAAAA AAAAAAAA 
AAAAAAA 
" 

Bu dosya ayrıştırıcı açma ve bir hata _csv.Error: newline inside string atar edilir. Ben 2 alanda içinden tırnak işaretleri kaldırarak bu varlık sorunu için aşağı narrrowed ve csv.reader modül dosya Tamam ayrıştırır

Bazıları alanlar çok satırlıdır - bunu bilmek önemli mi emin değilim.

Lehim ayarlarında dolaşıyorum ve 'atlama başlangıç ​​alanını' bulabildiğim için, bu problemi çözmüyor gibi görünüyor.

Açık olmak gerekirse -. Bu gevşek alan testi içinde "karakter bir CSV yapıya uygulayın ancak var ve geçerli değil 'CSV', veri nesneleri

lineterminator \ x0d \ x0a

olduğunu doublequote anda değişik permuations ve lehçe modülünde alıntı değişkene gider arasında

bir dizi çalıştılar, ama bu doğru ayrıştırmak alınamıyor.

ben emin olamayacağı bir "veya" kombinasyon yalnızca alan sınırları üzerinde bulunur.

Bu sorun, yalnızca dosyadaki birkaç alanın biri (son) için var ve birkaç bin dosya var.

+3

düzgün CSV, alıntı yapılan alanda alıntı niteliğindeki bir karakterden kaçmak için birbirini takip eden iki alıntı karakteri ('" "') kullanır. Alternatif olarak, alan ayrılmamış olabilir ve hiçbir kaçış gerekli değildir, ancak virgül ve yeni satırlar böyle bir alanda görünemez. Bunun gibi tek tırnaklar normalde geçerli değildir. Diğer CSV okuyucularının (python dahil) beklentilerinin daha iyi olması için CSV verilerinizin kaynaklarının seçeneklerini değiştirmek mümkün mü? – SingleNegationElimination

+1

Verileri miras aldım - ve pek çok şey var ... Bu yüzden tekrar ayırabilen bir ayrıştırıcı oluşturmak dışında hiçbir şey yapamam. –

+0

Dosyalar zarar görmüyor, kötü/zayıf bir CSV olarak yapılandırılmış.“Verileri miras aldım” tam “mazeret” dir - bu sadece ne olur. Veri eski/terk edilmiş ve onu diriltmek istiyorum. –

cevap

3

Oldukça henüz yorum yapma izniniz yok, o yüzden cevap olarak göndeririz? Eğer değilse, o zaman büyük bir bulgu ve CSV işlemeden önce alanın son karakterleri önce ve önce tüm alıntı karakterlerini iki katına değiştirebilirsiniz.

+0

Ne yazık ki alan metinde de virgüller var, ama ben ayrıştırma için csv modülünü not etmem gerekecek - Alan metninde bir ya da "" kombinasyonunu bulamayacağına güvenemem. , tüm csv fikrini büstler hangi tür ... –

+0

Eh, bir düşünce oldu. Çalışmamda bir veritabanı için belirli bir veri alanı içinde, virgül kullanımını yasakladım. Bununla birlikte, sadece 50.000 satırlık dosyada sadece 100 kayıt olduğu için kurtulmayı başardım. – Herbie

+0

Onun güzel bir fikir, ama birkaç bin dosya var, her biri oldukça bilinmeyen - bekle - Bu şekilde yapabilirim - kabaca "chars dosyada nerede olduğunu biliyorum - onları bulabilirim, onları değiştirin çiftler ile, ve umarım bu şekilde geçerli bir csv yapmak. –

11

quoting anahtar sözcüğü ile geçmeyi denediniz mi? Bunu test etmek için bazı kod veya veriler olmadan, bunun aslında verileriniz üzerinde çalışıp çalışmadığını bilmenin bir yolu yok, ancak sağladığınız parça ile çalışıyor gibi görünüyor. verilerinize içinde herhangi virgül vardır

Eğer ayırıcı olarak virgül kullanan varsayarsak ...

>>> import csv 
>>> r = csv.reader(open('foo.csv', 'rb'), quoting=csv.QUOTE_NONE) 
>>> for row in r: print row 
... 
['"A"', '"B"', '"ccc "ccccccc" cccccc"'] 
+0

Bunu denedim, ancak bu dosyanın tamamını beyaz boşluk ve diğer çöplerle parçaladı. Csv listesinde sadece 7 öğe var, bu yöntem yüzlerce veriyor. –

+0

@Jay Gattuso, bu durumda, gerçekten daha fazla örnek veri göndermelisiniz. Dosya hangi sınırlayıcıyı kullanıyor? Veriler boyunca dağılmış tırnaklar ve virgüller varsa, farklı bir sınırlayıcı kullanmalıdır. Ya da sadece iyi oluşturulmuş bir csv dosyası değil. – senderle

+0

Sınırlayıcı, basit bir şekilde oluşturulmamış standart bir virgüldür. Önceden ayrışmış olabileceğimi düşünmeye başlıyorum, doğru koşulları arıyorum ve oradaki tırnakları iki katına değiştirdim ... Bunun için diyalektik modülün ne olduğunu düşünmüştüm. Daha fazla örnek yayınlayacağım, ancak onun paylaşılabilir olmayan verileri. Sorun şu ki, onun kötü csv, onun 'özel' değil. –

2

İlk csv'yi ayrıştıracak ve geçerli bir çıktı verecek bir dönüştürücü yazarım. Sınırlamayı belirleyen mekanizma olarak "veya" \ n kullanabilirsiniz.

+0

Bu geçerlidir, ancak geçerli alan işaretçileri her zaman \ n sınırlarında değildir ve geçerli bir CSV işareti varsayımı olarak tehlikeli olabilir. –