CSV z przecinkiem czy średnikiem?

80

Jak ogólnie jest budowany plik CSV? Przecinkami czy średnikami? Masz jakąś radę, której użyć?

Membersound
źródło
5
Zobacz Wartości rozdzielane przecinkami (Wikipedia).
Jesper
4
CSV -> Wartości
oddzielone
@ChadNC Też o tym pomyślałem, wybierając separator, którego będzie używał mój kod. Najłatwiejszym rozwiązaniem było użycie ;, które jest automatycznie rozpoznawane zarówno w systemie Ubuntu, jak i Windows, bez konieczności dyktowania jakichkolwiek konkretnych ustawień.
gsamaras,

Odpowiedzi:

77

W systemie Windows jest to zależne od ekranu dostosowywania „Opcje regionalne i językowe”, na którym znajduje się separator listy. Jest to znak, który aplikacje Windows mają być separatorem CSV.

Oczywiście działa to tylko w aplikacjach Windows, na przykład Excel nie podzieli automatycznie danych na kolumny, jeśli plik nie używa wspomnianego powyżej separatora. Wszystkie aplikacje korzystające z ustawień regionalnych systemu Windows będą miały takie zachowanie.

Jeśli piszesz program dla Windows, który będzie wymagał zaimportowania CSV w innych aplikacjach i wiesz, że separator listy ustawiony dla twoich maszyn docelowych to ,, to idź do niego, w przeciwnym razie wolę, ;ponieważ powoduje mniej problemów z przecinkami dziesiętnymi, grupowaniem cyfr i nie pojawia się w dużej ilości tekstu.

Sibster
źródło
35
Ta zmiana wpłynie również na otwieranie plików CSV w programie Excel. Jeśli chcesz, aby plik CSV był bardziej zgodny z systemem Windows, umieść go sep=;na górze pliku CSV.
papo
11
> „Wolę; ponieważ powoduje mniej problemów z przecinkiem”. To jest złe rozwiązanie. Jeśli separatorem jest przecinek, a wartość komórki również zawiera przecinek, musisz ująć wartość w podwójne cudzysłowy. Na przykład: 111 222, „33,5”, 444, „55,98”, 666
Elmue
1
Dotyczy to również aplikacji Mac Numbers. Wyciągałem włosy, ponieważ nie mogłem zrobić pliku csv, który rozpoznał Photoshop. Zmieniłem opcję regionu z powrotem na angielski amerykański i wszystko znów działało dobrze
Tibidabo
21
Ta regionalna rzecz jest najgłupszą rzeczą, jaką można było zrobić. W jaki sposób format pliku csv może być różny w różnych regionach, co oznacza, że ​​moi koledzy nie mogą otwierać ani zapisywać pliku csv dla facetów z komputerem w innym regionie .. oucch
Miguel
Jeśli programujesz w systemie Windows Club C++pod nim, możesz użyć następującego interfejsu API do pobrania całego systemu lub separatora użytkownika:GetLocaleInfo(lcid, LOCALE_SLIST, buff, _countof(buff));
ahmd0
52

Powiedziałbym trzymać się przecinka, ponieważ jest to powszechnie rozpoznawane i rozumiane. Pamiętaj jednak, aby cytować swoje wartości i unikać cytatów.

ID,NAME,AGE
"23434","Norris, Chuck","24"
"34343","Bond, James ""master""","57"
adarshr
źródło
5
+1 za
opisanie
1
Samo oddzielanie przecinków jest dobre, ale pojawiają się problemy, gdy pojawiają się pola, które zawierają przecinki. Oto dobre odniesienie, które znalazłem w instrukcji
Ibu
4
ŹLE! Na moim komputerze, jeśli napiszę plik CSV używając przecinków jako separatorów i otworzę go w Excelu, cała linia zajmie tylko jedną kolumnę! To musi być jakieś ustawienie regionalne systemu Windows!
sergiol
2
@sergiol Nie jestem pewien, jak to unieważnia to, co powiedzieli.
AMC
51

CSV jest standardowym formatem opisanym w RFC 4180 (w 2005 roku), więc nie brakuje standardu. https://www.ietf.org/rfc/rfc4180.txt

A nawet wcześniej C w CSV zawsze oznaczało przecinek, a nie półkolon :(

Szkoda, że ​​Microsoft to ignoruje i nadal trzyma się potworności, w którą go przemienili dziesiątki lat temu (tak, przyznaję, to było przed powstaniem RFC).

  • Jeden rekord w wierszu, chyba że w cytowanym tekście występuje znak nowej linii (patrz poniżej).
  • COMMA jako separator kolumn. Nigdy średnik.
  • PERIOD jako kropka dziesiętna w liczbach. Nigdy przecinek.
  • Tekst zawierający przecinki, kropki i / lub znaki nowego wiersza ujęte w „podwójne cudzysłowy”.
  • Tylko wtedy, gdy tekst jest ujęty w podwójne cudzysłowy, takie cudzysłowy w tekście są poprzedzane podwojeniem. Te przykłady reprezentują te same trzy pola:

    1, "ten tekst zawiera" "cudzysłowy" "", 3

    1, ten tekst zawiera „cudzysłowy”, 3

Norma nie obejmuje wartości daty i czasu, osobiście staram się trzymać formatu ISO 8601, aby uniknąć pomyłki dzień / miesiąc / rok - miesiąc / dzień / rok.

Luc VdV
źródło
16
Monstruyczność nigdy by się nie pojawiła, gdyby na pierwszym miejscu wybrano średnik. Przecinek jest używany nie tylko do separatorów dziesiętnych lub tysięcy, ale także bardzo często w tekście, w przeciwieństwie do średnika. Średnik byłby lepszym wyborem, ponieważ jest znacznie rzadszy ...
AFract
14
Kiedy powiedziałem o potworności, miałem na myśli, że Microsoft uzależnił to od języka. Excel otwiera pliki CSV i traktuje je jako arkusze kalkulacyjne i może zapisywać arkusze kalkulacyjne w formacie CSV, ale plik CSV zapisany przez Excel w USA (na przykład) nie zadziała, jeśli ktoś we Francji lub Belgii spróbuje go otworzyć i odwrotnie. Jakikolwiek standard jest dla mnie OK, o ile istnieje taki, który sprawdza się dla każdego.
Luc VdV
4
„CSV to standardowy format, określony w RFC 4180 (w 2005 r.), Więc nie brakuje standardu”. Niestety, RFC 4180 to prośba o komentarze, a NIE standard. U góry jest napisane - „nie określa żadnego standardu internetowego”. Później jest napisane, że RFC 4180 „dokumentuje format, który wydaje się być używany przez większość implementacji”. Wygląda na to, że została stworzona przez małą prywatną firmę, niezwiązaną z żadną normą. To doskonały punkt wyjścia, ale niestety istnieje wiele plików CSV, które nie są zgodne z tym „standardem”.
Jim Rea
9
WSZYSTKIE standardy internetowe nazywane są RFC.
Luc VdV,
2
Ale kiedy są standardowe, nie twierdzą, że nie mają być normatywne. Zamiast tego mają w sobie szereg normatywnych sekcji, co nie ma miejsca w RFC 4180.
Frédéric
42

Również istotne, ale szczególnie po to, by wyróżnić się, spójrz na tę odpowiedź i tę, która sugeruje, wstawiając wiersz na początku pliku CSV z

"sep=,"

Aby poinformować program Excel, którego separatora się spodziewać

Rafareino
źródło
3
Działa z programem Excel, ale nie jest rozpoznawany przez Microsoft Power BI.
Tomas Kubes
9

1.> Zmień format pliku na .CSV (rozdzielany średnikami)

Aby osiągnąć pożądany efekt musimy tymczasowo zmienić delimiterustawienie w ExcelOpcjach:

Move to File -> Options -> Advanced -> Editing Section

Odznacz ustawienie „Użyj separatorów systemowych” i umieść przecinek w polu „Separator dziesiętny”.

Teraz zapisz plik w .CSVformacie, a zostanie on zapisany w formacie rozdzielanym średnikami.

hugo bourret-desmarais
źródło
6

Początkowo miał to być przecinek, jednak ponieważ przecinek jest często używany jako przecinek dziesiętny, nie byłby tak dobrym separatorem, stąd inne, takie jak średnik, głównie zależne od kraju

http://en.wikipedia.org/wiki/Comma-separated_values#Lack_of_a_standard


źródło
Ta część artykułu w Wikipedii zniknęła. Możesz ponownie utworzyć link do en.wikipedia.org/wiki/Comma-separated_values#Basic_rules. Zawiera on fragment dotyczący ustawień regionalnych:> „ Sąsiadujące pola muszą być oddzielone pojedynczym przecinkiem. Jednak formaty„ CSV ”różnią się znacznie pod względem ten wybór znaku separatora. W szczególności w ustawieniach regionalnych, w których przecinek jest używany jako separator dziesiętny, zamiast niego używany jest średnik, TAB lub inne znaki. "
Jules Kerssemakers
4

CSV to plik oddzielony przecinkami. Generalnie separatorem jest przecinek, ale widziałem wiele innych znaków używanych jako separatory. Po prostu nie są tak często używane.

Jeśli chodzi o porady, czego użyć, musimy znać Twoją aplikację. Czy plik jest specyficzny dla twojej aplikacji / programu, czy też musi współpracować z innymi programami?

Youssef G.
źródło
6
Myślę, że w Europie; jest powszechne. Przede wszystkim dlatego, że mamy przecinki w liczbach takich jak 60,00 €.
oferuje
5
@oers To nie powinno mieć znaczenia tak długo, jak "quote"Twoje wartości.
adarshr
Cóż, przeważnie widziałem inne ograniczniki używane w sieciowaniu plików seed, ale europejskie pieniądze też się sprawdzają!
Youssef G.
4

Aby zmienić przecinek na średnik jako domyślny separator Excela dla CSV - przejdź do Region -> Ustawienia dodatkowe -> zakładka Numery -> Separator listy i wpisz; zamiast domyślnego,

Michael
źródło
1
Jeśli ustawienia regionalne są ustawione ,jako separator dziesiętny i wyeksportujesz plik z kolumnami oddzielonymi ,po otwarciu W programie Excel tekst pojawi się TYLKO w JEDNEJ kolumnie. W programie Excel 2013 wybierz pierwszą kolumnę, przejdź do DANE -> Tekst do kolumn -> Wybierz Delimited, kliknij, Nexta następnie wybierz tylko Commawłączone, Delimitersa natychmiast zobaczysz zmiany w Data previewi na końcu kliknijFinish
sergiol
2

Cóż, żeby mieć coś do powiedzenia na temat średnika. W większości krajów przecinek jest tym, co służy do oznaczania dziesiętnego, a nie kropki. Przeważnie kolonie UE, które składają się na połowę świata, kolejna połowa jest zgodna ze standardami brytyjskimi (jak do diabła w Wielkiej Brytanii jest tak duże O_O), więc z kolei używanie przecinka do bazy danych zawierającej liczbę powoduje duży ból głowy, ponieważ Excel odmawia uznania go jako separatora .

Podobnie jak w moim kraju, Wietnamie, postępuj zgodnie ze standardami francuskimi, nasz partner HongKong używa standardu brytyjskiego, więc przecinek powoduje, że CSV nie nadaje się do użytku, a my używamy \ t lub; zamiast tego do użytku międzynarodowego, ale nadal nie jest to „standardowe” zgodnie z dokumentem CSV.

Tran Vu Dang Khoa
źródło
-3

najlepszym sposobem będzie zapisanie go w pliku tekstowym z rozszerzeniem csv:

Sub ExportToCSV()
Dim i, j As Integer
Dim Name  As String

Dim pathfile As String

Dim fs As Object
    Dim stream As Object

    Set fs = CreateObject("Scripting.FileSystemObject")
On Error GoTo fileexists

i = 15
Name = Format(Now(), "ddmmyyHHmmss")
pathfile = "D:\1\" & Name & ".csv"

Set stream = fs.CreateTextFile(pathfile, False, True)

plik istnieje:

If Err.Number = 58 Then
    MsgBox "File already Exists"
    'Your code here
    Return
End If
On Error GoTo 0

j = 1
Do Until IsEmpty(ThisWorkbook.ActiveSheet.Cells(i, 1).Value)

    stream.WriteLine (ThisWorkbook.Worksheets(1).Cells(i, 1).Value & ";" & Replace(ThisWorkbook.Worksheets(1).Cells(i, 6).Value, ".", ","))

    j = j + 1
    i = i + 1
Loop


stream.Close

End Sub
AzizD
źródło