Artikel - Detailansicht

Icon Aktuelles Importieren von CSV-Dateien

CSV-Dateien sind ein beliebter Weg um datenbankübergreifend Datensätze auszutauschen. Die CSV-Dateien sind im Prinzip einfache Textdateien, deren Spalten durch einen definierten Delimiter (z.b. ein Semikolon) getrennt sind. Als Trennzeichen zwischen verschiedenen Datensätzen wird im allgemeinen ein Zeilenumbruch benutzt. Generieren lassen sich diese Dateien normalerweise mit jeder Datenbank oder Tabellenkalkulationssoftware, wie z.B. MS-Excel. Diese Datei muss dann nur noch mit dem Browser auf den Server geladen und von ColdFusion gelesen und in die Datenbank geschrieben werden. Um auch Zeichen im Datensatz übertragen zu können, die als Trennzeichen definiert sind, sollte man die einzelnen Datenwerte mit doppelten Hochkommatas (") einrahmen. Prinzipiell ist als Begrenzungszeichen jedes Zeichen geeignet, da man bei der Konvertierung angeben kann, welches Zeichen als Begrenzungszeichen für ein Datenfeld dient.

Mit dem CFHTTP-Tag von ColdFusion kann man sehr einfach eine Textdatei einladen und in ein typisches Queryset umwandeln. Diese Funktion ist sehr einfach zu bedienen und gleichzeitig ein mächtiges Arbeitsmittel, wenn es um den Import von Daten geht.

Das folgende Beispielprogramm soll über ein HTML-Formular eine CSV-Datei zum Server übertragen und dann als Queryset ausgegeben werden.

Dazu muss zuerst eine CSV-Datei erzeugt werden. Das kann man z.b. (für Testzwecke) mit einem Texteditor erledigen oder man benutzt Excel. Mit Excel kann man die Daten eingeben und dann beim Speichern den Datentyp CSV angeben.
Man muss bei Erstellen der Datei noch beachten, dass die erste Zeile als Spaltenbezeichner interpretiert wird, dort müssen also die Spaltenbezeichner angeben werden.
Die Datei könnte dann wie folgt aussehen:

"id";"name";"wert1";"wert2"
1;"foo";1232;768
2;"bar";32;265
3;"boqus";2345;34
4;"asynton";32;767

Das ganze Beispielprogramm steht in einer einzigen Seite, beim ersten Aufruf (HTTP-Methode ist GET) wird das Uploadformular angezeigt. Dazu fragen wir zuerst die Variable CGI.REQUEST_METHOD ab und verzweigen in Abhänogkeit des Aufruf-Typs. Im Uploadformular befindet sich ein FILE-Element, dass es ermöglicht, ein lokales File als Wert auszuwählen. Dieses File wird dann automatisch vom Browser bei einem Submit zum Server geschickt. Wichtig ist noch, dass im Formular ENCTYPE=multipart/form-data eingestellt ist.

<FORM name="form"
  ACTION="<cfoutput>#CGI.script_name#</cfoutput>"
  ENCTYPE="multipart/form-data"
  METHOD="post">

  <INPUT TYPE="FILE" NAME="filename"><br>
  <INPUT TYPE="SUBMIT" VALUE=" uploaden ">
</FORM>   


Nach dem Submit kann die Datei auf dem Server vom ColdFusion bearbeitet werden. Mit der folgenden Zeile wird die Datei in ein temporäres Verzeichnis abgelegt:

  

<cffile action="UPLOAD"
        filefield="filename"
        destination="D:\Inetpub\wwwroot\temp\"
        nameconflict="makeunique">

Da man später auf die zum Server übertragene Datei mit dem HTTP-Protokoll zugreifen muss, sollte das Zielverzeichnis irgendwo im Root des Webservers liegen. Hier ist D:\Inetpub\wwwroot\ das Webroot. Die Datei wird im Unterverzeichnis /temp abgelegt. Der Attributwert nameconflict="makeunique" sorgt dafür, das die Datei bei Bedarf (wenn bereits eine Datei dieses Namens existiert) in einen eindeutigen Dateinamen umbenannt wird.
Die upgeloadete Datei kommt also nicht unbedingt mit dem alten Namen auf dem Server an!
Der entgültige Dateiname auf dem Server steht nach dem Upload in der Variable FILE.ServerFile zur Verfügung.

Jetzt muss die Datei, die ja nun schon auf dem Server liegt, noch in ein Queryset konvertiert werden.
Man könnte jetzt natürlich die Datei ganz normal mit CFFILE lesen und jede Zeile selbst konvertieren, aber es geht einfacher. Das CFHTTP-Tag kann diese Konvertierung selbst durchführen. Dazu geben wir die URL des Files an und holen es mit der HTTP-Methode GET. Mit dem Attribut NAME geben wir den Namen des zu erzeugenden Querysets an. DELIMIETR gibt an, welches das Trennzeichen zwischen den Datenfeldern eines Datensatzes ist.
Wie bereits gesagt, kann in einem Datenfeld auch das Trennzeichen als Wert unterbringen, wenn man die Felder mit einem Qualifizierer einschliesst (im allgemeinen ein "). Das gibt man mit dem Attrinut TEXTQUALIFIZIERER an. Die erste Zeile wird als Spaltenbezeichner interpretiert, gibt man aber mit COLUMNS neue Spaltenüberschriften an, werden diese anstatt der enthaltenen Spaltennamen benutzt und im Queryset integriert.

<cfhttp method="Get"
      url="http://localhost/temp/#file.ServerFile#"
      name="daten"
      delimiter=";"
      textqualifier="""">


Nach diesem Codeabschnitt hat man ein normales Queryset und kann die Daten wie gewohnt bearbeiten und auch in eine Datenbank schreiben. Im folgenden werden dynamisch die enthaltenen Spaltennamen mit der Eigenschaft COLUMNLIST des Querysets ermittelt und ausgegeben:

<cfloop index="column" list="#daten.ColumnList#">
  <cfoutput>
    #column# <br>
  </cfoutput>
</cfloop>



Hier noch das vollständige Programm:

<body>
  <cfif comparenocase(cgi.request_method,"POST")>

           action="<cfoutput>#CGI.script_name#</cfoutput>"
        ENCTYPE="multipart/form-data"
        METHOD="post">

  <input type="FILE" name="filename"><br>
  <input type="SUBMIT" value=" uploaden ">
  </form>
  <cfelse>

  <cfparam name="form.filename">

  <cffile action="UPLOAD"
          filefield="filename"
          destination="D:\Inetpub\wwwroot\temp\"
          nameconflict="makeunique">

  <cfhttp method="Get"
          url="http://localhost/temp/#file.ServerFile#"
          name="daten"
          delimiter=";"
          textqualifier="""">

  <cfloop index="column" list="#daten.ColumnList#">
    <cfoutput>
      #column# &nbsp;|&nbsp;
    </cfoutput>
  </cfloop>
  <br>

  <cfoutput query="daten">
    <cfloop index="column" list="#daten.ColumnList#">
       <cfset value=evaluate("daten.#column#")>
       #value# &nbsp;|&nbsp;
    </cfloop>
    <br>
  </cfoutput>
</cfif>
</body>



Steffen Goldfuss steffen@goldfuss.de - 08.01.2000

Zurück


Das deutsche ColdFusion-Forum cfml.de ist das Portal für Einsteiger und Experten zum Thema ColdFusion und der ColdFusion Markup Language (CFML).

© 2017 Webdesign & Hosting: CHC ONLINE Kassel | SOLVA Content-Management-System CMS
Urlaub-Angebote.de - Urlaub mit Bestpreis-Garantie buchen