Biçimlendirmeyi bozmadan CSV sütunlarına virgül eklemenin bir yolu var mı?


283

Ad ve numara içeren iki sütunlu bir CSV'm var. Bazı kişilerin adları virgül kullanır, örneğin Joe Blow, CFA.Bu virgül, CSV biçimini bozar, çünkü yeni bir sütun olarak yorumlanır.

Okudum ve en yaygın reçete bu karakteri veya sınırlayıcıyı yeni bir değerle (örneğin this|that|the, other) değiştiriyor gibi görünüyor .

Virgül ayırıcıyı gerçekten tutmak istiyorum (excel'in diğer sınırlayıcıları desteklediğini biliyorum, ancak diğer tercümanlar olmayabilir). Ayrıca, Joe Blow| CFAoldukça aptalca göründüğü gibi, virgül de adında tutmak istiyorum .

Biçimlendirmeyi bozmadan CSV sütunlarına virgül eklemenin bir yolu var mı, örneğin kaçarak?



Benim için çalışan küçük bir kesmek: csv dosyasını bir metin düzenleyicide açın, sonra bir excel belgesine yapıştırın. Bunu büyük parçalar halinde yapabiliyorsanız çalışır.
Jonas

@Jonas: Excel, aynı belirtecin sınırlayıcı mı yoksa verilerin bir parçası olarak mı kullanıldığını tahmin edemez. Bir metin düzenleyiciden yapıştırmak bunu değiştirmez.
IInspectable

Yanıtlar:


373

Alanı tırnak içine alın, örn.

field1_value,field2_value,"field 3,value",field4, etc...

Wikipedia'ya bakınız .

Güncellendi :

Bir teklifi kodlamak için, kullanın ", bir alandaki bir çift tırnak sembolü olarak kodlanır ""ve tüm alan olur """". Örneğin, Excel'de aşağıdakileri görürseniz:

---------------------------------------
| regular_value |,,,"|  ,"", |"""   |"|
---------------------------------------

CSV dosyası şunları içerecektir:

regular_value,",,,""",","""",","""""""",""""

Bir virgül, tırnak işaretleri kullanılarak basitçe kapsüllenir, böylece ,olur ",".

Bir virgül ve alıntı kapsüllenmeli ve alıntılanmalıdır, öyle ","olur """,""".


4
Bu benim için çalıştı! CSV'ye bir js değişkeni veriyordum ve her dizenin etrafına fazladan bir çift tırnak koymak, soruda belirtildiği gibi "John Blow, CFA" sorununu çözmeye yardımcı oldu.
Madhulika Mukherjee

Her hücrenin içinde hem tırnak hem de virgül varsa ne olur?
speedplane

2
Cevabı bazı örneklerle güncelledim - kısacası, virgüller tırnak işaretleri (örneğin ",") içinde kapsüllenmiş ve tırnak işaretleri (örn. """)
Ryan

6
Şimdi bu, kullanım örneklerinin% 99'unu çözecek harika bir çözüm önerdiği için kabul edilen cevap olmalıdır.
BuZz

Alıntı kaçan alanları ile csv dosyaları ayrıştırmak için bir C # kitaplığı var mı?
Minh Tran

34

CSV formatıyla ilgili sorun, tek bir spesifikasyon olmaması, hangi yöntemlerin kullanılması gerektiğini ayırt etmek için (kabul / yorumlamak için) birkaç kabul edilmiş yöntem olmasıdır. Ben karakterleri kaçmayı tüm yöntemleri tartışıldı (bu durumda yeni satır, ama aynı temel öncül) başka bir yazı . Temel olarak, amaçlanan kullanıcılar için bir CSV oluşturma / kaçma işlemi kullanmak ve geri kalanının umursamamasını ummak.

Referans spesifikasyon belgesi .


10
RFC 4180, Virgülle Ayrılmış Değerler (CSV) Dosyaları için Ortak Biçim ve MIME Türü, ietf.org/rfc/rfc4180.txt ; bir başka 'resmi' şartname.
Shi

3
En yaygın kabul gören yaklaşımı dahil etmek, bu harika bir cevap olacaktır. Duruşurken, @Ryan'ın yanıtı kazanıyor.
rinogo

16

Eğer bunu söylemek istiyorsanız, tırnak işaretleri kullanabilirsiniz. Böyle bir şey

$name = "Joe Blow, CFA.";
$arr[] = "\"".$name."\"";

şimdi, ad değişkeninizde virgül kullanabilirsiniz.


Bahşiş için teşekkürler Cloud, bunu yaptı: $whatever = "\"".$name."\"";
washes 13:17

Çözümünüz için teşekkürler.
Bhavin Thummar

10

Bu değerleri belirtmelisiniz.
İşte daha ayrıntılı bir spesifikasyon.


2
Birden fazla özellik var, Excel girişin etrafında tırnak kullanıyor, Linux ters eğik çizgi karakterini kullanıyor. Maalesef, hedef kitleniz / hedef sisteminiz için kaçmanız gerekiyor.
Rudu

7

Diğer cevaplardaki noktalara ek olarak: Excel'de tırnak işaretleri kullanıp kullanmadığınızı belirtmeniz gereken bir nokta boşluklarınızın yerleştirilmesidir. Böyle bir kod satırınız varsa:

print '%s, "%s", "%s", "%s"' % (value_1, value_2, value_3, value_4)

Excel, ilk alıntıyı virgüllerden kaçmak için kullanmak yerine gerçek bir alıntı olarak ele alacaktır. Kodunuzun şu şekilde değiştirilmesi gerekir:

print '%s,"%s","%s","%s"' % (value_1, value_2, value_3, value_4)

Beni buraya getiren bu incelikti.


3

Aynı sorunla karşılaştım ve alıntı ,yapmadım. Sonunda, yerini ,ile +, gerekli işlemler tamamlandıktan, bir outfile içine çıkışı kaydedilir ve yerini +ile ,. Bu çirkin görünebilir ama benim için çalıştı.


2
Ve veriler "+" karakterleri içeriyorsa ne yapardınız?
Andrew Morton

1
@AndrewMorton Evet, bu bir meydan okuma. Ama benim durumumda, bunun +verilerimde hiç bulunmadığından eminim . Nazik yorumunuz için teşekkürler.
Muhammed

4
Basit ve sağlam yol, dizeleri çift tırnak içine almak ve bunlardan iki tanesini kullanarak dizelerdeki çift tırnaklardan kaçmaktır "". Bunu yapmanın normal yolu budur.
Andrew Morton

1
Çalışmıyorsa, sınırlayıcı virgüllerinizin yanında boşluk oluşturmadığınızı kontrol edin: "Kurbağa", "sarı, yeşil", "Kurbağa", "sarı, yeşil" çalışmaz
Dazbert

Şahsen ben @AndrewMorton ikinci yorum buldum aslında kabul edilen cevap daha iyi ne anlamamı yardımcı oldu. Adım 1 - veri alanlarında çift tırnak kaçmak, örneğin Python: field = field.replace('"', '""')Adım 2 - Adım 1'den sonra, alanın kendisini çift tırnak içine alın örneğin field = '"' + field + '"'- o zaman bence demir dökümsünüz.
Croxford

3

Dilinize bağlı olarak, bir to_json yöntemi kullanılabilir. Bu, CSV'leri kıran birçok şeyden kaçacak.


3

Mac'teki Numbers gibi bazı uygulamaların, önündeki boşluk varsa çift tırnak işaretini görmezden geldiğini buldum.

a, "b,c"çalışırken çalışmaz a,"b,c".


1
Muhtemelen bana sadece bir saatlik işten tasarruf ettin ... teşekkür ederim!
Shaun314



0

Sen kullanabilirsiniz Text_Qualifierolarak sizin Düz dosya Bağlantı yöneticisinde alan ". Bu, verilerinizi tırnak içine almalı ve yalnızca tırnak işaretleri dışındaki virgüllerle ayırmalıdır.


0

İlk olarak, öğe değerinde çift tırnak işareti (") varsa, 2 çift tırnak işareti (" ") ile değiştirin

item = item.ToString().Replace("""", """""")

Son olarak, öğe değerini sarın:

SOLA: Çift tırnak işareti (") ile

SAĞ ÜZERİNDE: Çift tırnak işareti (") ve virgül karakteri (,)

csv += """" & item.ToString() & ""","

0

Çift tırnak benim için işe yaramadı, benim için çalıştı \". Örnek olarak çift tırnak koymak isterseniz ayarlayabilirsiniz \"\".

Formüller oluşturabilirsiniz, örneğin:

fprintf(strout, "\"=if(C3=1,\"\"\"\",B3)\"\n");

csv ile yazacak:

= EĞER (C3 = 1 "", B3)


0

Burada ihtiyaç duyulan şey olmayabilir ama bu çok eski bir soru ve cevabı başkalarına yardımcı olabilir. Farklı bir ayırıcıyla Excel'e içe aktarmada yararlı bulduğum bir ipucu, dosyayı bir metin düzenleyicide açmak ve aşağıdaki gibi bir ilk satır eklemek:

Eylül = |

nerede | Excel'in kullanmasını istediğiniz ayırıcıdır. Alternatif olarak, Windows'ta varsayılan ayırıcıyı değiştirebilirsiniz, ancak biraz uzun soluklu:

Denetim Masası> Saat ve bölge> Bölge> Biçimler> Ek> Sayılar> Liste ayırıcı [virgülten tercih ettiğiniz alternatife geçin]. Bu, Excel'in seçilen ayırıcıyı kullanarak CSV'leri dışa aktarmaya varsayılan olacağı anlamına gelir.

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.