Prawdziwa różnica między Excel CSV a Standardowym CSV

16

Jaka jest prawdziwa różnica między plikiem CSV programu Excel a standardowym plikiem CSV?

Na przykład, kiedy obsługują kolumny z podziałami linii w jednej komórce, w jaki sposób kodują ją inaczej?

użytkownik157195
źródło

Odpowiedzi:

19

Zależy to absolutnie od tego, co definiujesz jako „standardowy” CSV. Jeśli o mnie chodzi, Excel przestrzega zasad określonych w RFC 4180 , „Wspólnym formacie i typie MIME dla plików CSV”.

Rozważ tabelę, w której pierwsza komórka w pierwszym rzędzie ma dwa podziały wiersza. W programie Excel wyglądałoby to tak:

+---+---------------+------------+------------+
|   | A             | B          | C          |
+---+---------------+------------+------------+
| 1 | col1, line1a  |            |            |
|   | col1, line1b  |            |            |
|   | col1, line1c  | col2, row1 | col3, row1 |
| 2 | col1, row2    | col2, row2 | col3, row2 |
+---+---------------+------------+------------+

W jaki sposób Excel to eksportuje? Zobaczmy - edytor tekstu wyświetli to:

"col1, line1a
col1, line1b
col1, line1c","col2, row1","col3, row1"
"col1, row2","col2, row2","col3, row2"

Niezbyt wyrafinowane. Wstawia znak powrotu karetki (szesnastkowy 0D) w miejscu, w którym podział linii był w naszej komórce. Każda komórka jest otoczona podwójnymi cudzysłowami. Ponadto rzeczywiste rzędy są oddzielone znakiem powrotu karetki.

Aby przeanalizować to poprawnie, parser CSV musiałby to zrobić

  • zignoruj ​​ten znak powrotu karetki, gdy pojawia się w podwójnym cudzysłowie (tj. komórka)
  • nie ignoruj ​​powrotu karetki, gdy pojawia się poza podwójnymi cudzysłowami

Gdyby tak się nie stało, skończyłoby się czymś takim zniekształconym - zauważ, że teraz są cztery linie zamiast dwóch, ponieważ nie zignorował podziałów linii.

+---+---------------+------------+------------+
|   | A             | B          | C          |
+---+---------------+------------+------------+
| 1 | "col1, line1a |            |            |
| 2 | col1, line1b  |            |            |
| 3 | col1, line1c" | col2, row1 | col3, row1 |
| 4 | col1, row2    | col2, row2 | col3, row2 |
+---+---------------+------------+------------+

Ale zobaczmy, co mówi RFC, może Excel zrobił to dobrze?

Pola zawierające podział wiersza (CRLF), podwójne cudzysłowy i przecinki powinny być ujęte w cudzysłowy.

Zgrabne, właśnie to zrobił Excel. Podsumowując, Excel wydaje się postępować zgodnie z zaleceniami „standardowego” pliku CSV. Przy odpowiednim parserze CSV powinien on także być w stanie czytać pliki Excel CSV.

slhck
źródło
@shhck: dlaczego widzę implementacje parsera csv oddzielające „excel” csv i „csv”? Uważam również, że program Excel jest całkiem solidną implementacją.
user157195
@ user157195 Zależnie od analizatora składni, powinieneś przeczytać w jego dokumentacji, dlaczego istnieje różnica między danymi wejściowymi programu Excel i innymi programami. Nie rozumiem, dlaczego taki powinien być. Znam to tylko z R , który traktuje Excel CSV tak jak każdy inny. Może jednak również czytać XLS.
slhck
2
Jako osoba, która od lat programowo odczytuje pliki CSV generowane w programie Excel we wszystkich kształtach i rozmiarach, mogę potwierdzić, że slhck jest w 100% poprawny - Excel generuje w 100% „standardowe” pliki CSV. Za każdym razem.
Mark Henderson
@Farseeker Dzięki za potwierdzenie! (i masz teraz 1337 przedstawicieli!)
slhck
5
Uwaga! W krajach, które używają „,” jako miejsca dziesiętnego, Excel będzie „bardzo bardzo sprytny” i użyje „”; znak separatora. Dzięki temu Zee Germanz nie widzi zbyt wielu „cytatów”; „w”; „ich”; „plików”. Niestety, jeśli wyślą go do biura w Wielkiej Brytanii, otrzyma AllSmooshedUpIntoASingleCellOnEveryLine. Znakomity.
Luke Usherwood
-1

Rozumiem z oryginalnej implementacji csv, że wszystkie pola tekstowe są ujęte w cudzysłowy i nie muszą być liczbami. Program Excel tego nie robi, a próba przesłania plików CSV wygenerowanych przez program Excel na platformy inne niż Microsoft nie działa. Jest to standardowe podejście Microsoft, ignoruj ​​interoperacyjność i skup się na ślepym przestrzeganiu zasad. Podobnie stało się z IE, postępowali zgodnie z regułami html / css poprawnie dla atrybutów dopełnienia i marginesu i zignorowali fakt, że każda istniejąca strona i przeglądarka internetowa traktowali je inaczej. W rezultacie prawie każda strona internetowa ma teraz specjalne reguły dla IE. Uważam, że pliki csv tworzone przez program Excel są bezużyteczne i używam kolumny funkcji „konkatenacji”, aby ręcznie je samodzielnie utworzyć.

Edwin
źródło