Rss Feed
Tweeter button
Facebook button
Linkedin button
Webonews button
Delicious button
Flickr button
May 10

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 + A ;)  als 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.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Apr 22

Schon lange sind die Tage vorbei, bei denen man mit bloßem CSS und ein bißchen Markup einen bombigen Drupal-Theme gebaut hat. Der Themer von heute stützt sich auch gerne mal auf JavaScript für Effekte, die den Kunden dann hoffentlich vom Hocker pusten.
Eine JavaScript-Datei in einem Drupal-Theme einzubinden ist angeblich nicht schwer – sagt zumindest die Seite in der Dokumentation. Ist ja spitze, denkt man sich und das war auch mein Gedanke.

Jetzt hatte ich den Fall, das ich eine gewisse JavaScript-Datei nur dann mit in die Seitenausgabe aufnehmen wollte, wenn bestimmte Page-Variablen gesetzt sind. Also fix die Funktion template_preprocess_page in der entsprechenden template.php meines Themes überladen und brav meinen Aufruf von drupal_add_js eingebaut. Alles auch ganz erwartungsvoll dem oben genannten Artikel folgend umgesetzt. Somit sah das ganze ungefähr so aus:

/**
 * @brief
 * Implementation von template_preprocess_page.
 *
 * @see http://api.drupal.org/api/function/template_preprocess_page/6
 */
function meintheme_preprocess_page(&$variables) {
  // JavaScript nur einhängen, wenn die Variable TRUE ist.
  if ($variables['irgendwas']) {
    drupal_add_js(drupal_get_path('theme', 'meintheme') . '/js/mein.js', 'theme');
  }
}

Alles klar, speichern, hochladen, Drupal Caches leeren, Seite neuladen. Nichts passiert.

Gut, OK kann passieren. Code überprüft, alles schlüssig. Dann Firebug geöffnet und nachgesehen, ob auch ein entsprechender Eintrag im -Bereich der Seitenausgabe steht. Natürlich nicht. Es schien von Anfang an schon zu einfach zu sein -.-
Um das ganze jetzt kurz zu machen, hier die Erklärung warum die Referenz auf die JavaScript-Datei nicht da war, obwohl offensichtlich alles richtig zu sein schien.

Das Problem liegt darin, dass die Page-Variablen in Drupal u.a. auch die Referenzen auf alle registrierten JavaScript-Dateien umfassen. Lässt man sich in der obigen Funktion nämlich einfach mal $variables['scripts'] ausgeben (bspw. mit Hilfe des Devel-Moduls, so sieht man alle entsprechenden Einträge. Der Aufruf von drupal_add_js() findet also zu spät statt, da die Page-Variable $scripts (wie sie in page.tpl.php heißt) bereits gefüllt wurde.
Sieht man sich hierzu die Core-Implementation in Drupal 6 von template_preprocess_page einmal genauer an, stößt man auf diese Zeile:

$variables['scripts'] = drupal_get_js();
 

Genau darin liegt der Trick. Dupliziert man diese Zeile einfach nach dem Aufruf von drupal_add_js in der template.php, so wird auch unsere JavaScript-Datei ausgeben.
Das Endergebnis sieht dann ungefähr so aus:

/**
 * @brief
 * Implementation von template_preprocess_page.
 *
 * @see http://api.drupal.org/api/function/template_preprocess_page/6
 */
function meintheme_preprocess_page(&$variables) {
  ....
  // JavaScript nur einhängen, wenn die Variable TRUE ist.
  if ($variables['irgendwas']) {
    drupal_add_js(drupal_get_path('theme', 'meintheme') . '/js/mein.js', 'theme');
    $variables['scripts'] = drupal_get_js();
  }
  ....
}

Happy Theming, kids!

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter