Wie kann ich verhindern, dass Excel meine köstlichen CSV-Dateien frisst und nutzlose Daten ausscheidet?

128

Ich habe eine Datenbank, die den Verkauf von Widgets anhand der Seriennummer verfolgt. Benutzer geben Käuferdaten und -mengen ein und scannen jedes Widget in ein benutzerdefiniertes Client-Programm. Sie schließen dann die Bestellung ab. Das alles funktioniert einwandfrei.

Einige Kunden möchten eine Excel-kompatible Tabelle der von ihnen gekauften Widgets. Wir generieren dies mit einem PHP-Skript, das die Datenbank abfragt und das Ergebnis als CSV mit dem Speichernamen und den zugehörigen Daten ausgibt. Das funktioniert auch sehr gut.

Wenn die Datei in einem Texteditor wie Notepad oder vi geöffnet wird, sieht sie folgendermaßen aus:

"Account Number","Store Name","S1","S2","S3","Widget Type","Date"
"4173","SpeedyCorp","268435459705526269","","268435459705526269","848 Model Widget","2011-01-17"

Wie Sie sehen, sind die Seriennummern vorhanden (in diesem Fall sind nicht alle sekundären Serien doppelt vorhanden) und bestehen aus langen Zahlenfolgen. Wenn diese Datei in Excel geöffnet wird, lautet das Ergebnis:

Account Number  Store Name  S1  S2  S3  Widget Type Date 
4173    SpeedyCorp  2.68435E+17     2.68435E+17 848 Model Widget    2011-01-17

Wie Sie vielleicht bemerkt haben, werden die Seriennummern in doppelte Anführungszeichen gesetzt. Excel scheint Textqualifizierer in CSV-Dateien nicht zu berücksichtigen. Beim Importieren dieser Dateien in Access treten keine Schwierigkeiten auf. Beim Öffnen als Text kein Problem. Aber Excel wandelt diese Dateien ohne Zweifel in unnützen Müll um. Der Versuch, Endbenutzer in die Kunst des Öffnens einer CSV-Datei mit einer nicht standardmäßigen Anwendung einzuweisen, wird, sagen wir, mühsam. Gibt es hoffnung Gibt es eine Einstellung, die ich nicht finden konnte? Dies scheint bei Excel 2003, 2007 und 2010 der Fall zu sein.

atroon
quelle
46
kann ich nur für den Namen eine +1 geben?
Tombull89
11
Excel does not seem to respect text qualifiers in .csv files- Die doppelten Anführungszeichen sind keine Textqualifizierer. Sie lassen lediglich Kommas in Ihren Daten zu. Wenn Sie in Ihren Daten keine Kommas verwenden, sind sie bedeutungslos . Alle Daten in einer CSV-Datei sind untypisiert, sodass Excel nur erraten kann, dass es sich bei Ihrer großen Seriennummer um eine Zahl handelt. In diesem Fall wird Excel mit einer maximalen Genauigkeit von 15 Stellen ausgeführt, wodurch Ihre Zahlen abgeschnitten werden.
DMA57361
1
Excel scheint nicht alle Kommas in doppelten Anführungszeichen zu berücksichtigen. Denken Sie an "12. August 2012". Excel wandelt das auch in Müll um.
Zundarz
5
Ich möchte diese SU-Frage erwähnen . Es wird erläutert, welche Optionen Sie beim Umgang mit CSV in Excel haben.
Nixda
1
@ nixda Danke! Dies sind nützliche Vorschläge, insbesondere für erfahrene Benutzer. Mein Problem ist fast mehr ein menschliches Problem, da Excel sich mit CSV-Dateien verbindet und die Leute das Symbol sehen und doppelt klicken (weil Sie so Dinge öffnen) und dann normalerweise auf Speichern klicken (weil wir es immer sagen) sie zu retten!), und alles ist verloren. Aber ich werde auf jeden Fall Ihre Methoden anwenden, wenn dies möglich ist.
Atroon

Antworten:

58

Aber Excel wandelt diese Dateien ohne Zweifel in unnützen Müll um.

Excel ist unnützer Müll.

Lösung

Ich wäre ein wenig überrascht, wenn ein Kunde, der Ihre Daten in einem Excel-Format haben möchte, die sichtbare Formatierung dieser drei Spalten nicht in "Zahl" mit Null-Dezimalstellen oder in "Text" ändern könnte. Nehmen wir jedoch an, dass eine kurze Anleitung nicht in Frage kommt.

Ihre Möglichkeiten sind:

  1. Geben Sie in Ihre Seriennummern ein nicht numerisches Zeichen und kein Leerzeichen ein.
  2. Schreiben Sie eine XLS-Datei oder eine XLSX-Datei mit einer bestimmten Standardformatierung aus.
  3. Schummeln Sie und geben Sie diese Zahlen als Formeln aus ="268435459705526269","",="268435459705526269"(Sie können sich auch ="268435459705526269",,="268435459705526269"2 Zeichen sparen). Dies hat den Vorteil, dass es korrekt angezeigt wird und wahrscheinlich allgemein nützlich ist, aber subtil unterbrochen wird (da es sich um Formeln handelt).

Seien Sie vorsichtig mit Option 3, da einige Programme (einschließlich Excel und Open Office Calc) Kommas in =""Feldern nicht mehr als maskiert behandeln. Das bedeutet, ="abc,xyz"dass zwei Spalten überspannt werden und der Import abgebrochen wird.

Die Verwendung des Formats von "=""abc,xy"""behebt dieses Problem, diese Methode beschränkt Sie jedoch aufgrund der Längenbeschränkung für Excel-Formeln weiterhin auf 255 Zeichen.

Tyler
quelle
1
Eigentlich ist das nicht hart. Kopieren Sie eine der oben genannten Zahlen und fügen Sie sie in Excel ein. Ändern Sie dann das vorgeschlagene Zahlenformat. Excel ändert den Wert, was zu Müll führt.
Joe Internet
1
@ Joe, ich war auf meiner ersten Übersicht zu flüchtig. Excel produziert in der Tat Müll und ist selbst Müll. Ich habe meine Antwort aktualisiert, um dies widerzuspiegeln. Eine Option könnte sein, eine "Excel-CSV" und auch eine "brauchbare, lohnende CSV" zu haben
Tyler
2
@ Tyler - Ich glaube nicht, dass Excel Müll ist. Ich sage nur, dass OP richtig war und in diesem Fall Müll produziert hat. Es ist eigentlich eine sehr gute Frage, ohne eine anscheinend elegante Lösung.
Joe Internet
1
Die Option Zellen formatieren ... wurde vorgeschlagen und ich habe versucht, sie zu verwenden. In diesem Fall scheint Excel, sobald Sie die Datei öffnen, die Serien in die wissenschaftliche Notation zu konvertieren (vereinbart, nicht unerwartet) und die Genauigkeit zu verfälschen. Wenn Sie sie in eine Zahl oder einen Text ändern, wird die Zeichenfolge nicht zurückgegeben. Das ist wirklich der Kern des Problems. Die Ausgabe als Formeln kann es aber tun ... Daran habe ich nicht gedacht.
Am
9
@ DMA57361 Das Verhalten wird nicht erwartet, es ist bestimmbar. Die numerische Genauigkeit ist gut dokumentiert, wie Excel CSVs nicht liest. Das Fehlen von Warnungen und das stille Löschen von Daten ist absurd. Die Tatsache, dass Sie Excel nicht einmal mitteilen können, wie die Daten importiert werden, ist ebenso absurd. Wird die Negativität benötigt ? Nein, aber Ehrlichkeit ist die beste Politik und so fühle ich mich.
Tyler
42

Wir hatten ein ähnliches Problem, bei dem wir CSV-Dateien mit Spalten hatten, die Bereiche wie 3-5 enthielten, und Excel sie immer in Datumsangaben umwandelte, z. Wir kamen daran vorbei

  1. Umbenennen der CSV in TXT-Erweiterung
  2. Wenn wir es dann in Excel öffneten, wurde der Textimport-Assistent gestartet
  3. In Schritt 3 von 3 des Assistenten haben wir angegeben, dass die betreffenden Spalten Text sind und ordnungsgemäß importiert wurden.

Hier könnte man das Gleiche machen, würde ich denken.

Textimport-Assistent

Prost

user65525
quelle
2
+1 für die richtige Vorgehensweise. (edit: sorry musste ein wenig editieren um die lösung zu klären)
jay
2
Sie müssen Ihre Datei nicht umbenennen. Verwenden Sie einfach den Import-Assistenten. Wählen Sie bei gedrückter Umschalttaste alle Spalten aus und wählen Sie sie als Text aus.
Nixda
1
Der Textimport-Assistent ist DIE Antwort. Alle anderen Lösungen sind unnötig, da Sie nicht verstehen, wie Excel zum Anzeigen und Bearbeiten von CSVs verwendet wird.
Hervorragend
1
@Excellll, mache es eine Datei auf einmal sicher. Wenn dieser Prozess automatisiert wird, spart unnötiges Hacken oft den Tag.
Parrish Ehemann
1
Dies ist völlig nutzlos, wenn Excel von Standardbenutzern zum Anzeigen von CSV-Dateien verwendet wird. Bevor ich versuche zu erklären, wie man den Text-Import-Assistenten für ~ 15 Office-Benutzer mit Anfängerkenntnissen verwendet, möchte ich den Quellcode des Excel-Dokuments lieber selbst eingeben.
Northkildonan
8

Eine bessere Lösung ist das Generieren einer XML-Arbeitsmappe. So was:

<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
  </OfficeDocumentSettings>

  <ss:Worksheet ss:Name="Sheet 1">
    <Table>
    <Column ss:Width="100"/>
    <Column ss:Width="100"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="80"/>
    <Column/>

    <Row>
      <Cell><Data ss:Type="String">Account Number</Data></Cell>
      <Cell><Data ss:Type="String">Store Name</Data></Cell>
      <Cell><Data ss:Type="String">S1</Data></Cell>
      <Cell><Data ss:Type="String">S2</Data></Cell>
      <Cell><Data ss:Type="String">S3</Data></Cell>
      <Cell><Data ss:Type="String">Widget Type</Data></Cell>
      <Cell><Data ss:Type="String">Date</Data></Cell>
    </Row>

    <Row>
      <Cell><Data ss:Type="String">4173</Data></Cell>
      <Cell><Data ss:Type="String">SpeedyCorp</Data></Cell>
      <Cell><Data ss:Type="String">268435459705526269</Data></Cell>
      <Cell><Data ss:Type="String">x</Data></Cell>
      <Cell><Data ss:Type="String">268435459705526269</Data></Cell>
      <Cell><Data ss:Type="String">848 Model Widget</Data></Cell>
      <Cell><Data ss:Type="String">2011-01-17</Data></Cell>
    </Row>


    </Table>
    <x:WorksheetOptions/>
  </ss:Worksheet>
</Workbook>

Die Datei muss die Erweiterung .xml haben. Excel und OpenOffice öffnen es richtig.

zwanzigbierreserviert
quelle
Meinen Sie, dass das OP PHP-Skript verwenden soll, um die Datenbank in das XML-Format zu konvertieren?
Prasanna
2
Sehr viel sauberer, als wenn Benutzer .csv in Excel öffnen oder Ihre CSV durcheinander bringen, sodass nur Excel Ihre CSV verstehen kann. Es ist nicht einmal der Komplex eines Schemas.
binki
Wo ist dieser Standard dokumentiert? Ich würde gerne mehr über die verfügbaren Datentypen erfahren.
John Doherty
1

Meine Lösung: Ich habe das gleiche Problem beim Importieren von Seriennummern. Sie müssen nicht als Zahlen behandelt werden, dh es werden keine mathematischen Funktionen ausgeführt, aber wir benötigen die gesamte Zahl darin. Das Einfachste, was ich habe, ist, ein Leerzeichen in die Seriennummer einzufügen. zB "12345678 90123456 1234". Wenn Excel es importiert, wird es als Text anstelle einer Zahl behandelt.

Peterlip
quelle
0

Ich hatte lange Kontonummern verstümmelt.

So habe ich es behoben:

Öffnen Sie die Datei file.csv in Libre Office / Open Office (möglicherweise müssen Sie Trennzeichen usw. angeben) und speichern Sie die Datei als Excel-XML-Datei.

Öffnen Sie dann diese Datei in Excel und Sie werden sehen, dass die Spalten nicht länger in ein wissenschaftliches Format oder was auch immer geändert werden. Klicken Sie aus Sicherheitsgründen mit der rechten Maustaste auf die Spalte, und legen Sie das Format explizit als Text fest. Speichern Sie es dann als Excel-Dateiformat.

Öffnen Sie die Excel-Formatdatei und die Spalte sollte noch in Ordnung sein!

user127379
quelle
1
Während dies funktionieren würde , verursacht der Versuch, jemandem, der nur gebrochenes Englisch spricht, zu erklären, warum er eine andere Office-Suite verwenden müsste, ebenso viele Probleme, wie es löst. Alternative Software zu M $ Office ist meiner Meinung nach alles Gute, aber mir ist klar, dass ich nicht alle konvertieren kann.
Uhr
0

Der Import-Assistent ist die beste Lösung für gelegentliche Benutzer und einmalige Situationen. Wenn Sie eine programmgesteuerte Lösung benötigen, können Sie die QueryTables.Add-Methode verwenden (die der Import-Assistent im Hintergrund verwendet).

Workbooks.Add
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & "C:\myfile.csv", Destination:=Range("$A$1"))
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 437
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = True
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 2, 2) 'Edit this line. Add a number for each column, 1 is general, 2 is text. Search the internet for other formats.
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
End With
PBeezy
quelle