Formatowanie pliku CSV rozdzielanego przecinkami, aby zmusić program Excel do interpretowania wartości jako łańcucha

64

Szukałem przez jakiś czas, próbując wymyślić, jak wydrukować plik CSV w taki sposób, aby zmusić Excela do interpretowania wartości jako ciągu i nie próbowałem konwertować ich na liczby lub daty.

na przykład:

"141", "10/11/2002", "350.00", "1311742251"

Excel próbuje „inteligentnie” przekonwertować je na natywne formaty daty / liczb. Czy jest na to jakiś sposób?


EDYCJA: Wyjaśniłem cel mojego pytania, przepraszam za zamieszanie.

Simon East
źródło

Odpowiedzi:

67

W przypadku tych, którzy mają kontrolę nad danymi źródłowymi, najwyraźniej program Excel automatycznie wykryje format pola CSV, chyba że kolumna CSV ma ten format:

"=""Data Here"""

na przykład...

20,       5.5%,      "0404 123 351", "3-6",  "=""123"""
[number]  [percent]  [number]        [date]  [string]  <-- how Excel interprets

Działa również w arkuszu kalkulacyjnym Google, ale nie jest pewne, czy inne aplikacje arkusza kalkulacyjnego obsługują tę notację.

Jeśli podejrzewasz, że dane mogą zawierać same cytaty, musisz je podwójnie usunąć , tak jak to ...

"=""She said """"Hello"""" to him"""



(EDYCJA: Zaktualizowano z poprawkami, dzięki DMA57361!)

Simon East
źródło
Wspaniale, musimy tylko zmienić dane ... westchnienie
Drogi
4
Ta ostatnia kolumna powinna być "=""123"""inaczej źle sformułowana. Pola zawierające a "muszą być rozdzielone, a "s w polu ucieka z innymi "s.
DMA57361,
@ DMA57361 właściwie to, co on ma, jest w porządku, to pozostałe dwa pola obok niego nie mają wcześniejszego znaku równości. Umieścił tam formułę tej komórki, aby zwracała ciąg znaków. Aby tego uniknąć, możesz ustawić typ danych komórki na „Tekst”.
Przełom
2
@Przeglądanie tamtejszej tabeli reprezentuje plik CSV, a nie pola Excela. Ostatnia wartość ="123"nie jest prawidłowym polem CSV, ponieważ zawiera znak ogranicznika pola " bez prawidłowego rozgraniczenia go lub pola. Fakt, że Excel odczytuje go jako formułę, zależy wyłącznie od Excela i nie ma nic wspólnego z plikiem CSV.
DMA57361,
2
@PriceChild, celem mojego pierwotnego pytania (którego tak naprawdę nie wytłumaczyłem zbyt dobrze) było w rzeczywistości sformatowanie pliku CSV, aby było to możliwie jak najłatwiejsze dla użytkowników. I to jest odpowiedź, którą znalazłem i chciałem napisać. DMA57361 faktycznie przyniósł również pomocną poprawkę, dzięki!
Simon East
36

Jak wielu, zmagam się z tymi samymi decyzjami, które podejmuje Microsoft i wypróbowałem różne sugerowane rozwiązania.

W przypadku programu Excel 2007 wygląda to następująco:

  • Umieszczenie wszystkich wartości w podwójnych cudzysłowach NIE pomaga
  • Umieszczenie = przed wszystkimi wartościami po umieszczeniu ich w podwójnych ćwierciach POMAGA, ALE sprawia, że ​​plik csv jest bezużyteczny dla większości innych aplikacji
  • Umieszczanie nawiasów wokół podwójnych cudzysłowów wokół wszystkich wartości jest śmieciem
  • Umieszczenie spacji przed wszystkimi wartościami przed umieszczeniem wokół nich podwójnych cudzysłowów NIE pozwala na konwersję dat, ale NIE zapobiega przycinaniu wiodących lub końcowych zer.
  • Umieszczenie pojedynczego cudzysłowu przed wartością działa tylko podczas wprowadzania danych w programie Excel.

Jednak:

Umieszczenie tabulacji przed wszystkimi wartościami przed umieszczeniem wokół nich podwójnych cudzysłowów NIE pozwala na konwersję na daty ORAZ zapobiega przycinaniu wiodących lub końcowych zer, a arkusz nie wyświetla nawet nieprzyjemnych znaczników ostrzegawczych w lewym górnym rogu każdej komórki.

Na przykład:

"<tab character><some value>","<tab character><some other value>"

Pamiętaj, że znak tabulacji musi znajdować się w podwójnych cudzysłowach. Edycja: okazuje się, że podwójne cudzysłowy nie są nawet konieczne.

Dwukrotne kliknięcie pliku csv może otworzyć plik jako arkusz kalkulacyjny w programie Excel pokazujący wszystkie wartości, które są traktowane jak powyżej, np. Dane tekstowe. Upewnij się, że program Excel używa „.” jako przecinek dziesiętny, a nie „,” lub każdy wiersz pliku csv, skończy jako jeden tekst w pierwszej komórce każdego wiersza. Najwyraźniej Microsoft uważa, że ​​CSV oznacza oddzielną wartość „nie przecinek dziesiętny”.

ajabo
źródło
Ta sztuczka z kartami uratowała mi dzień, Excel konwertuje naprawdę długie wartości liczbowe na liczby i stracił wszystkie cyfry po 15. Udało się sprawić, aby Excel traktował je jako tekst z prefiksem karty. Działa to również w przypadku liczb, nie tylko dat.
Markus Yrjölä
To jest naprawdę przydatne, dziękuję!
Flavio
22

Korzystanie z funkcji importu Excela pozwala określić format (auto, tekst lub datę), każda kolumna powinna być interpretowana jako i nie wymaga modyfikacji plików danych.

Można go znaleźć jako DataGet External DataFrom Textw programie Excel 2007/2010.
Lub DataImport External DataImport Dataw programie Excel 2003.

Oto obraz Kreatora importu tekstu Excel 2003 w akcji na podanych przykładowych danych, pokazujący importowanie dwóch ostatnich kolumn jako tekstu:

Excel 2003: Kreator importu tekstu w kroku 3 - typy danych

DMA57361
źródło
Doskonała odpowiedź DMA57361, dzięki za wszystkie szczegóły. To, czego tak naprawdę nie wspomniałem w swoim pytaniu, to to, że piszę skrypt, który eksportuje dane do Excela, więc starałem się uniemożliwić użytkownikom przeskakiwanie takich mylących opcji. Ale i tak cię przegłosował. :-)
Simon East
@ Simon, w czym piszesz skrypt? W jaki sposób możesz zmusić go do bezpośredniego tworzenia rzeczywistych plików Excel, zamiast przechodzenia przez format pośredni?
DMA57361,
to skrypt PHP, który eksportuje tabelę bazy danych. CSV jest prawdopodobnie najłatwiejszy w obsłudze, ale masz rację, prawdopodobnie mógłbym stworzyć XLS za pomocą jakiegoś kodu open source, a nawet po prostu tabeli HTML, która, jak sądzę, z wcześniejszych doświadczeń daje rozsądne wyniki w Excelu (pozwala kolory i formatowanie itp., ale nie masz pewności co do typów danych).
Simon East
1
Jest kilka pytań na temat SO na temat PHP → Excel, w pierwszych kilku, które wypróbowałem, znalazłem odpowiedź wskazującą na PHP Excel , więc warto to sprawdzić.
DMA57361,
to bardzo pomocne, po przeczytaniu kilku anserów
greg121
1

Przykład Simona nie działał dla mnie i podejrzewam, że jest to różnica językowa. W języku C # wygląda mój ciąg formatu roboczego:

var linebreak = (i++ == list.Count) ? "" : "\r\n";

csv += String.Format("=\"{0}\",{1},{2},{3},=\"{4}\"{5}",
    item.Value, item.Status, item.NewStatus, item.Carrier, c.Status, linebreak);

i tak wygląda plik wyjściowy:

="abababababab",INVALID,INVALID,USPS,="",
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793482982812",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793482982812",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793000216184",UNKNOWNSTATUS,INVALID,USPS,=""

Jak widać, format pliku wyjściowego ="VALUE",nie jest, "=""VALUE""",jak sądzę, konwencją Visual Basic.

Korzystam z programu Excel 2010. Nawiasem mówiąc, Arkusze Google nie otwierają / konwertują pliku sformatowanego w ten sposób. Będzie działać, jeśli usuniesz w ten sposób znak równości "VALUE",- program Excel nadal otworzy plik, ale zignoruje fakt, że chcesz, aby kolumny były ciągami znaków.

Shane
źródło
-2

Prostym sposobem zmuszenia programu Excel do interpretowania daty jako tekstu jest umieszczenie pojedynczego cudzysłowu przed datą, zamiast używania pełnych cudzysłowów, jak w:

„10/11/2002

Jeśli możesz zaimportować plik CSV zamiast go otwierać, możesz powiedzieć Excelowi, jaki format powinna mieć każda kolumna. Spójrz na to pytanie, które zadałem .

hdhondt
źródło
5
Odrzucone z powodu tego NIE działa w plikach CSV importowanych do Excela. Excel interpretuje cytat jako dosłowny i dlatego pokazuje go w komórce.
psynnott