616 Stimmen

Ist es möglich, Excel zu zwingen, UTF-8 CSV-Dateien automatisch zu erkennen?

Ich entwickle einen Teil einer Anwendung, der für den Export einiger Daten in CSV-Dateien verantwortlich ist. Die Anwendung verwendet immer UTF-8 aufgrund ihrer mehrsprachigen Natur auf allen Ebenen. Aber das Öffnen solcher CSV-Dateien (die z.B. Diakritika, kyrillische Buchstaben, griechische Buchstaben enthalten) in Excel führt nicht zu den erwarteten Ergebnissen, es wird etwas wie „/¤, –/¶ angezeigt. Und ich weiß nicht, wie ich Excel dazu bringen kann zu verstehen, dass die geöffnete CSV-Datei in UTF-8 kodiert ist. Ich habe auch versucht, UTF-8 BOM EF BB BF anzugeben, aber Excel ignoriert das.

Gibt es einen Workaround?

P.S. Welche Tools könnten sich möglicherweise so verhalten wie Excel?


UPDATE

Ich muss sagen, dass ich die Community mit der Formulierung der Frage verwirrt habe. Als ich diese Frage gestellt habe, habe ich nach einem Weg gefragt, eine UTF-8 CSV-Datei in Excel ohne Probleme für einen Benutzer, auf eine fließende und transparente Weise zu öffnen. Allerdings habe ich eine falsche Formulierung verwendet und nach einer automatischen Lösung gefragt. Das ist sehr verwirrend und steht im Widerspruch zur VBA-Makroautomatisierung. Es gibt zwei Antworten auf diese Frage, die ich am meisten schätze: die allererste Antwort von Alex, die ich akzeptiert habe; und die zweite von Mark, die etwas später erschienen ist. Aus usability-Sicht schien Excel einen Mangel an benutzerfreundlichem UTF-8-CSV-Support zu haben, daher halte ich beide Antworten für korrekt, und ich habe Alex' Antwort zuerst akzeptiert, weil sie wirklich feststellte, dass Excel das nicht transparent konnte. Das ist das, was ich hier mit automatisch verwechselt habe. Marks Antwort fördert einen komplizierteren Weg für fortgeschrittenere Benutzer, um das erwartete Ergebnis zu erzielen. Beide Antworten sind großartig, aber Alex' Antwort passt etwas besser zu meiner nicht klar spezifizierten Frage.


UPDATE 2

Fünf Monate nach der letzten Bearbeitung habe ich festgestellt, dass die Antwort von Alex aus irgendeinem Grund verschwunden ist. Ich hoffe wirklich, dass es kein technisches Problem war und ich hoffe, dass es keine weitere Diskussion darüber gibt, welche Antwort jetzt besser ist. Deshalb akzeptiere ich Marks Antwort als die beste.

1 Stimmen

Kannst du tabellengetrennte Dateien verwenden? Wenn ja, hast du vielleicht mehr Glück.

11 Stimmen

Office 2010+: beste funktioniert: UTF-16LE mit BOM und \t als Trennzeichen. Funktioniert in englischen und nicht englischen Excel-Einstellungen. Kann Strg-S drücken, ohne das Dateiformat auszuwählen, usw. Wird Unicode-Zeichen beibehalten.

0 Stimmen

@Duncan ganz ehrlich, ich bin verwirrt und es ist "schwierig zu beurteilen". Ich habe alex's Antwort vor mehr als 2 Jahren akzeptiert (beide am 14. Mai) und dann hat Mark geantwortet und einen trickreichen Workaround vorgeschlagen (den ich tatsächlich nicht überprüft habe), der überraschenderweise mehr Punkte bei meiner Frage erzielt hat, die überraschenderweise auch populär wurde. Wir haben schon vor langer Zeit den Excel-Support in meinem Projekt abgelehnt, und ich möchte alex's Reputation nicht schmälern, weil Excel anscheinend, und wahrscheinlich immer noch (bitte korrigiere mich, wenn ich falsch liege), CSV falsch behandelt. Es ist schwierig zu sagen, tut mir leid.

3voto

Nur um Benutzern zu helfen, die interessiert sind, die Datei in Excel zu öffnen, die diesen Thread wie ich erreichen.

Ich habe den untenstehenden Assistenten verwendet und es hat bei mir funktioniert, eine UTF-8-Datei zu importieren. Nicht transparent, aber nützlich, wenn Sie die Datei bereits haben.

  1. Öffnen Sie Microsoft Excel 2007.
  2. Klicken Sie auf die Datenmenüleiste.
  3. Klicken Sie auf das Symbol "Aus Text".
  4. Navigieren Sie zum Speicherort der Datei, die Sie importieren möchten. Klicken Sie auf den Dateinamen und dann auf die Schaltfläche "Importieren". Das Textimport-Assistent - Schritt 1 oder 3-Fenster wird jetzt auf dem Bildschirm erscheinen.
  5. Wählen Sie den Dateityp, der Ihre Daten am besten beschreibt - Getrennt oder Festbreite.
  6. Wählen Sie 65001:Unicode (UTF-8) aus der Dropdown-Liste, die neben Dateiursprung erscheint.
  7. Klicken Sie auf die Schaltfläche "Weiter", um das Textimport-Assistent - Schritt 2 oder 3-Fenster zu öffnen.
  8. Setzen Sie ein Häkchen neben dem Trennzeichen, das in der Datei verwendet wurde, die Sie in Microsoft Excel 2007 importieren möchten. Das Daten-Vorschau-Fenster zeigt Ihnen, wie Ihre Daten basierend auf dem von Ihnen gewählten Trennzeichen erscheinen werden.
  9. Klicken Sie auf die Schaltfläche "Weiter", um das Textimport-Assistent - Schritt 3 von 3 anzuzeigen.
  10. Wählen Sie das geeignete Datumsformat für jede Datenspalte aus, die Sie importieren möchten. Sie haben auch die Möglichkeit, eine oder mehrere Datenspalten nicht zu importieren, wenn Sie möchten.
  11. Klicken Sie auf die Schaltfläche "Fertig stellen", um Ihre Daten in Microsoft Excel 2007 zu importieren.

Quelle: https://www.itg.ias.edu/content/how-import-csv-file-uses-utf-8-character-encoding-0

3voto

TheCharlatan Punkte 182

Ja, das ist möglich. Wie von mehreren Benutzern bereits erwähnt wurde, scheint es ein Problem mit Excel zu geben, das den richtigen Byte-Order-Mark beim Lesen der Datei im UTF-8-Format nicht erkennt. Mit UTF-16 scheint es kein Problem zu geben, daher ist es für UTF-8 endemisch. Die Lösung, die ich dafür verwende, besteht darin, den BOM ZWEIMAL hinzuzufügen. Dafür führe ich den folgenden Sed-Befehl zweimal aus:

sed -I '1s/^/\xef\xbb\xbf/' *.csv

, wobei der Platzhalter durch jeden Dateinamen ersetzt werden kann. Dies führt jedoch dazu, dass sich die sep= am Anfang der .csv-Datei ändert. Die .csv-Datei wird dann normal in Excel geöffnet, jedoch mit einer zusätzlichen Zeile mit "sep=" in der ersten Zelle. Das "sep=" kann auch in der Ausgangsdatei .csv selbst entfernt werden, aber beim Öffnen der Datei mit VBA sollte das Trennzeichen angegeben werden:

Workbooks.Open(name, Format:=6, Delimiter:=";", Local:=True)

Format 6 ist das .csv-Format. Setzen Sie Local auf true, falls sich in der Datei Daten befinden. Wenn Local nicht auf true gesetzt ist, werden die Daten amerikanisiert, was in einigen Fällen das .csv-Format beschädigen kann.

1 Stimmen

Beim Ausführen des sed-Befehls erhalte ich folgende Meldung: "sed: ungültige Option -- 'I'", ich denke es sollte 'i' sein.

3voto

CannedMoose Punkte 494

Dies entspricht nicht genau der Frage, aber da ich darüber gestolpert bin und die obigen Lösungen für mich nicht funktioniert haben oder Anforderungen hatten, die ich nicht erfüllen konnte, hier ist eine andere Möglichkeit, das BOM hinzuzufügen, wenn Sie Zugriff auf vim haben:

vim -e -s +"set bomb|set encoding=utf-8|wq" dateiname.csv

2voto

praaveen V R Punkte 1220

Hi ich verwende Ruby on Rails für die CSV-Erstellung. In unserer Anwendung planen wir, auf die Mehrsprachigkeit (I18n) umzusteigen, und wir hatten ein Problem beim Anzeigen von I18n-Inhalten in der CSV-Datei von Windows Excel.

War in Ordnung mit Linux (Ubuntu) und Mac.

Wir haben festgestellt, dass Windows Excel die Daten erneut importiert benötigt, um die tatsächlichen Daten anzuzeigen. Beim Importieren erhalten wir mehr Optionen zur Auswahl des Zeichensatzes.

Aber dies kann nicht für jeden Benutzer erklärt werden, also die Lösung, die wir suchen, ist das Öffnen durch Doppelklick.

Dann haben wir festgestellt, wie man Daten im Windows Excel im Open Mode und BOM anzeigen kann, mit Hilfe von aghuddleston Gist. Hinzugefügt als Referenz.

Beispiel für I18n-Inhalt

In Mac und Linux

Schwedisch : Förnamn Englisch : Vorname

In Windows

Schwedisch : Förnamn Englisch : Vorname

def benutzerinformationsbericht(berichtsdateipfad, benutzer_id)
    benutzer = Benutzer.find(benutzer_id)
    I18n.locale = benutzer.current_lang
    open_mode = "w+:UTF-16LE:UTF-8"
    bom = "\xEF\xBB\xBF"
    body benutzer, open_mode, bom
  end

def überschriften
    überschriften = [
        "ID", "SDN ID",
        I18n.t('sys_first_name'), I18n.t('sys_last_name'), I18n.t('sys_dob'),
        I18n.t('sys_gender'), I18n.t('sys_email'), I18n.t('sys_address'),
        I18n.t('sys_city'), I18n.t('sys_state'), I18n.t('sys_zip'),
        I18n.t('sys_phone_number')
    ]
  end

def body mieter, open_mode, bom
    File.open(berichtsdateipfad, open_mode) do |f|
      csv_datei = CSV.generate(col_sep: "\t") do |csv|
        csv << überschriften
        mieter.patients.find_each(batch_size: 10) do |patient|
          csv <<  [
              patient.id, patient.patientid,
              patient.first_name, patient.last_name, "#{patient.dob}",
              "#{translate_gender(patient.gender)}", patient.email, "#{patient.address_1.to_s} #{patient.address_2.to_s}",
              "#{patient.city}", "#{patient.state}",  "#{patient.zip}",
              "#{patient.phone_number}"
          ]
        end
      end
      f.write bom
      f.write(csv_datei)
    end
  end

Wichtiges zu beachten hier ist Open Mode und BOM

open_mode = "w+:UTF-16LE:UTF-8"

bom = "\xEF\xBB\xBF"

Vor dem Schreiben der CSV BOM einfügen

f.write bom

f.write(csv_datei)

Windows und Mac

Datei kann direkt durch Doppelklick geöffnet werden.

Linux (Ubuntu)

Beim Öffnen einer Datei nach Trennungsoptionen fragen -> "TAB" wählen Bildbeschreibung hier eingeben

1voto

Luca Ziegler Punkte 2687

Ich habe eine Lösung für ASP.NET Core gefunden, um CSV-Dateien als UTF8 mit POM herunterzuladen:

byte[] csvBytes = Encoding.Default.GetBytes(csvString);
UTF8Encoding utf8 = new UTF8Encoding(true);
byte[] bom = utf8.GetPreamble();
var result = bom.Concat(csvBytes).ToArray();
return new FileContentResult(result, MediaTypeHeaderValue.Parse("text/csv; charset=utf-8"));

Excel erkennt die heruntergeladene CSV-Datei dann als UTF8.

1 Stimmen

Funktioniert wie ein Zauber, schön

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X