Czy istnieje sposób na dodanie przecinków do kolumn CSV bez przerywania formatowania?

282

Mam dwukolumnowy plik CSV z nazwą i numerem. Niektóre osoby używają przecinków, na przykład Joe Blow, CFA.Przecinek ten łamie format CSV, ponieważ jest interpretowany jako nowa kolumna.

Przeczytałem i najczęstszą receptą wydaje się być zastąpienie tego znaku lub zastąpienie separatora nową wartością (np this|that|the, other.).

Naprawdę chciałbym zachować separator przecinków (wiem, że excel obsługuje inne ograniczniki, ale inni tłumacze mogą nie). Chciałbym również zachować przecinek w nazwie, ponieważ Joe Blow| CFAwygląda dość głupio.

Czy istnieje sposób na dodanie przecinków do kolumn CSV bez przerywania formatowania, na przykład poprzez ich ucieczkę?

buley
źródło
1
Możliwy duplikat Postępowanie przecinkami w pliku CSV
Ciro Santilli 22 冠状 病 六四 事件 法轮功
Mały hack, który zadziałał dla mnie: otwórz plik csv w edytorze tekstu, a następnie wklej do dokumentu programu Excel. Działa, jeśli możesz to zrobić w dużych kawałkach.
Jonas
@Jonas: Excel nie może zgadnąć, czy ten sam token jest używany jako separator, czy też część danych. Wklejenie z edytora tekstu tego nie zmienia.
Widoczny

Odpowiedzi:

370

Umieść pole w cudzysłowie, np

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

Zobacz wikipedia .

Zaktualizowano :

Aby zakodować cytat, użyj ", jeden symbol podwójnego cudzysłowu w polu zostanie zakodowany jako ""i całe pole stanie się """". Jeśli więc widzisz następujące elementy, np. Excel:

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

plik CSV będzie zawierał:

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

Przecinek jest po prostu enkapsulowany za pomocą cudzysłowów, więc ,staje się ",".

Przecinek i cytat muszą być enkapsulowane i cytowane, tak ","się stanie """,""".

Ryan
źródło
4
To zadziałało dla mnie! Eksportowałem zmienną js do CSV i umieszczałem dodatkową parę cudzysłowów wokół każdego łańcucha, pomagając rozwiązać problem „John Blow, CFA”, jak wspomniano w pytaniu.
Madhulika Mukherjee
Co jeśli w każdej komórce są zarówno cudzysłowy, jak i przecinki?
samolot prędkości
2
Zaktualizowałem odpowiedź kilkoma przykładami - w skrócie przecinki są ujęte w cudzysłowy (np. ","), A cudzysłowy są unikane (np. """)
Ryan
6
Teraz TO powinna być zaakceptowana odpowiedź, ponieważ proponuje świetne rozwiązanie, które prawdopodobnie rozwiązuje 99% przypadków użycia.
BuZz
Czy istnieje biblioteka C # do parsowania plików csv z polami z cudzysłowami?
Minh Tran
34

Problem z formatem CSV polega na tym, że nie ma jednej specyfikacji, istnieje kilka zaakceptowanych metod, bez możliwości rozróżnienia, które należy zastosować (do generowania / interpretowania). Omówiłem wszystkie metody ucieczki znaków (w tym przypadku znaki nowej linii, ale te same podstawowe założenia) w innym poście . Zasadniczo sprowadza się to do użycia procesu generowania / ucieczki CSV dla zamierzonych użytkowników, mając nadzieję, że reszta nie będzie miała nic przeciwko.

Dokument specyfikacji referencyjnej .

Rudu
źródło
10
RFC 4180, Wspólny format i typ MIME dla plików wartości rozdzielanych przecinkami (CSV), ietf.org/rfc/rfc4180.txt ; jeszcze jedna „oficjalna” specyfikacja.
Shi
3
Włączenie najbardziej akceptowanego podejścia sprawiłoby, że jest to świetna odpowiedź. W tej chwili odpowiedź @Ryan wygrywa.
rinogo
16

Jeśli chcesz to powiedzieć, możesz użyć cudzysłowów. Coś takiego

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

więc teraz możesz używać przecinka w zmiennej nazwy.

Chmura
źródło
Dzięki Cloud za twoją wskazówkę, która to zrobiła: $whatever = "\"".$name."\"";
było
Dzięki za rozwiązanie.
Bhavin Thummar
10

Musisz podać te wartości.
Oto bardziej szczegółowa specyfikacja.

SLaks
źródło
2
Istnieje wiele specyfikacji, Excel używa cudzysłowów wokół wpisu, Linux używa znaku odwrotnego ukośnika. Niestety musisz uciec dla docelowego systemu odbiorców / odbiorców.
Rudu,
7

Oprócz punktów w innych odpowiedziach: jeśli używasz cudzysłowów w programie Excel, należy zwrócić uwagę na położenie spacji. Jeśli masz taką linię kodu:

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

Excel potraktuje początkowy cytat jako dosłowny cytat zamiast używać go do zmiany przecinków. Twój kod będzie musiał zmienić się na

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

To ta subtelność mnie tu sprowadziła.

hlongmore
źródło
3

Napotkałem ten sam problem i zacytowanie ,nie pomogło. Ostatecznie I otrzymuje ,się +, wykończone przetwarzania, zapisane na wyjście z outfile i otrzymuje +z ,. To może wydawać się brzydkie, ale zadziałało dla mnie.

Mohammed
źródło
2
A co byś zrobił, gdyby dane zawierały znaki „+”?
Andrew Morton,
1
@AndrewMorton Tak, to wyzwanie. Ale w moim przypadku jestem pewien, że w +ogóle nie ma takich danych. Dziękuję za miły komentarz.
Mohammed,
4
Prostym i solidnym sposobem jest zamknięcie ciągów znaków w cudzysłowy i unikanie podwójnych cudzysłowów w ciągach znaków za pomocą dwóch takich jak "". To jest normalny sposób na zrobienie tego.
Andrew Morton,
1
Jeśli to nie działa, sprawdź, czy nie generujesz spacji obok przecinków: „Żaba”, „żółty, zielony” zadziała „Żaba”, „żółty, zielony” nie
zadziała
Osobiście znalazłem tutaj drugi komentarz @AndrewMorton, który pomógł mi zrozumieć, co jest lepsze niż zaakceptowana odpowiedź. Krok 1 - unikaj podwójnych cudzysłowów w polach danych, np. W Pythonie: field = field.replace('"', '""')Krok 2 - po kroku 1 umieść pole w podwójnych cudzysłowach, np. field = '"' + field + '"'- myślę, że jesteś odlewem żelaznym.
Will Croxford,
3

W zależności od języka może być dostępna metoda to_json. Pozwoli to uniknąć wielu rzeczy, które psują CSV.

amiksch
źródło
3

Odkryłem, że niektóre aplikacje, takie jak Numbers na Macu, ignorują podwójny cudzysłów, jeśli jest przed nim miejsce.

a, "b,c"nie działa podczas a,"b,c"pracy.

mudin
źródło
1
Prawdopodobnie właśnie zaoszczędziłeś mi godzinę pracy ... dziękuję!
Shaun314
1

Możesz zakodować swoje wartości, na przykład w PHP base64_encode ($ str) / base64_decode ($ str)

IMO jest to prostsze niż podwojenie cytatów itp.

https://www.php.net/manual/en/function.base64-encode.php

Zakodowane wartości nigdy nie będą zawierać przecinka, więc każdy przecinek w pliku CSV będzie separatorem.

Kevin
źródło
1

Możesz używać literałów szablonów (ciągów szablonów)

np. -

`"${item}"`
सत्यमेव जयते
źródło
1
Działa jak urok!
waliurjs
0

Możesz użyć Text_Qualifierpola w menedżerze połączeń plików Flat do as ". To powinno zawinąć twoje dane w cytaty i oddzielić je przecinkami, które są poza cytatami.

sakshi jain
źródło
0

Po pierwsze, jeśli wartość pozycji ma znak podwójnego cudzysłowu („), zamień na 2 znak podwójnego cudzysłowu („ ”)

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

Na koniec zawiń wartość przedmiotu:

NA LEWO: ze znakiem podwójnego cudzysłowu („)

NA PRAWO: Ze znakiem podwójnego cudzysłowu („) i przecinkiem (,)

csv += """" & item.ToString() & ""","
LifeiSHot
źródło
0

Podwójne cytaty nie działały dla mnie, działały dla mnie \". Jeśli chcesz umieścić podwójne cudzysłowy jako przykład, możesz ustawić \"\".

Możesz budować formuły, na przykład:

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

napisze w csv:

= JEŻELI (C3 = 1, „”, B3)

mathengineer
źródło
0

Może nie być to, co jest potrzebne, ale jest to bardzo stare pytanie, a odpowiedź może pomóc innym. Porada, którą uważam za przydatną przy importowaniu do programu Excel przy użyciu innego separatora, to otwarcie pliku w edytorze tekstu i dodanie pierwszego wiersza, takiego jak:

sep = |

gdzie | to separator, którego chcesz używać w programie Excel. Alternatywnie możesz zmienić domyślny separator w systemie Windows, ale nieco przesadzony:

Panel sterowania> Zegar i region> Region> Formaty> Dodatkowe> Liczby> Separator list [zmień z przecinka na preferowaną alternatywę]. Oznacza to, że Excel domyślnie eksportuje również CSV przy użyciu wybranego separatora.

użytkownik25307
źródło