Hallo zusammen,
heute hatte ich das Problem, dass ich aus einer Excel 2007 Datei eine zu mySQL konforme CSV-Datei generieren musste. Ist kaum zu glauben, aber Excel 2007 erlaubt keinerlei großartige Einstellungen (bspw. Trennzeichen einstellen), sodass ich gezwungen war mir ein kleines Macro zu schreiben, was die Aufgabe erledigt.
Das Makro umgibt Felder mit einem optionalen Zeichen (bspw. Anführungszeichen), setzt ggf. Escape-Zeichen vor Trennzeichen innerhalb von Feldern etc.
Alles soweit ganz konform zu den Standard-Einstellungen des Tabellenimports von mySQL (zumindest bei unseren Hostern).
' Exportiert eine Selektion (bspw. STRG + Aals CSV konform mit mySQL. ' Copyright (C) 2010 netvio Sub CsvExport() ' Alle Variablen dimensionieren. Dim DestFile As String Dim FileNum As Integer Dim ColumnCount As Integer Dim RowCount As Integer Dim temp As String Dim delimiter As String Dim escapeChar As String Dim wrapBy As String ' Trennzeichen festlegen (Semikolon) delimiter = Chr(59) ' Escape-Character festlegen (Hier 0x5C bzw. 92d, sprich Backslash) escapeChar = Chr(92) ' Character festlegen mit dem die einzelnen Felder umgeben werden sollen (Anführungszeichen) wrapBy = Chr(34) ' Benutzer auffordern, den Namen der Zieldatei anzugeben. DestFile = InputBox("Namen der Zieldatei eingeben" _ & Chr(10) & "(mit vollständigem Pfad:", "Excel 2007 => mySQL CSV Exporter") ' Nächste freie Dateihandle-Nr. besorgen. FileNum = FreeFile() ' Fehlerprüfung deaktivieren. On Error Resume Next ' Versuchen, Zieldatei für Ausgabe zu öffnen. Open DestFile For Output As #FileNum ' Ggf. Fehler zurückmelden und beenden. If Err <> 0 Then MsgBox "Datei kann nicht geöffnet werden" & DestFile End End If ' Fehlerprüfung aktivieren. On Error GoTo 0 ' Innerhalb der Selektion soll Zeile für Zeile durchgeiert werden.. For RowCount = 1 To Selection.Rows.Count ' ..und darin dann die einzelnen Spalten. For ColumnCount = 1 To Selection.Columns.Count ' Text des Felds besorgen. temp = Selection.Cells(RowCount, ColumnCount).Text ' Das Trennzeichen darf nicht als solches in dem Feld vorkommen. ' Falls das doch der Fall ist, das Escape-Zeichen vorhängen, sofern ' Felder nicht mit einem Zeichen umgeben werden (i.d.R. Anführungszeichen). If wrapBy = Chr(0) Then ' Delimiterzeichen im Feld mit Escape-Zeichen versehen temp = Replace(temp, delimiter, escapeChar & delimiter) Else ' Soll jedes Feld mit einem Zeichen (bspw. Anführungszeichen) umgeben werden, so ' wird der Feldtext mit einem Zeichen umgeben. ' In dem Fall muss dieses Zeichen innerhalb des Felds mit einem Escape-Character versehen werden. temp = Replace(temp, wrapBy, escapeChar & wrapBy) ' Jetzt das Feld mit dem gewünschten Zeichen umgeben. temp = wrapBy & temp & wrapBy End If ' Feld in die Datei schreiben. Print #FileNum, temp; ' Prüfen, ob Zelle sich in der letzten Spalte befindet. If ColumnCount = Selection.Columns.Count Then ' Wenn ja, Leerzeile schreiben. Print #FileNum, Else ' Sonst Delimiter ausgeben Print #FileNum, delimiter; End If Next ColumnCount Next RowCount ' Zieldatei schließen. Close #FileNum End Sub
Habe damit heute ~5400 Datensätze erfolgreich migriert. Feedback, Fehlerbehebung etc. sind willkommen!
Viel Erfolg und ich hoffe ich erleichtere damit jemanden das Leben und nicht nur mir.












letzte Kommentare