SQL-Datenbank zu HTML und CSV

+ andere TechDocs
+ SQL
+ SQL mit Java
+ TXT zu CSV und XML
+


Dieses Programmierbeispiel liest über konfigurierbare SQL-Kommandos Datenbankinhalte und gibt den Inhalt auf der Konsole aus, erzeugt eine HTML-Datei und eine in Excel ladbare CSV-Datei (Comma Separated Values).



SQL-Datenbank zu Konsole, HTML und CSV

  1. Beachten Sie die grundsätzlichen Hinweise zu SQL, SQL-Kommandos und SQL mit Java.

  2. Installieren Sie ein aktuelles Java SE JDK.

  3. Legen Sie in Ihrem Workspace-Verzeichnis (z.B. \MeinWorkspace) eine neue Projektverzeichnisstruktur an, zum Beispiel so:

    cd \MeinWorkspace

    md DbZuCsvOderHtml

    cd DbZuCsvOderHtml

    md bin

    md lib

    md src\dbcsvhtml

  4. Das Beispiel benötigt eine Datenbank. Falls Sie noch keine installiert haben können Sie zum Beispiel MySQL installieren wie beschrieben unter: mysql.htm#InstallationUnterWindows.
    Weiterhin wird eine Datenbanktabelle mit Inhalt erwartet. Wählen Sie zum Beispiel als 'Database-Name' "MeineDb" ('CREATE DATABASE MeineDb;') und erstellen und füllen Sie eine Test-Datenbanktabelle (wie z.B. für 'MeineTestTabelle' gezeigt).
    Sie können das Beispiel natürlich auch an andere Datenbanken, Database-Namen und Tabellen anpassen.

  5. Downloaden Sie den zu Ihrer Datenbank passenden JDBC-Treiber in das lib-Verzeichnis.
    Zum Beispiel für MySQL: mysql-connector-java-5.1.16-bin.jar aus mysql-connector-java-5.1.16.zip.
    Oder zum Beispiel für die Oracle Database: ojdbc6.jar.

  6. Erzeugen Sie im src\dbcsvhtml-Verzeichnis folgende Java-Sourcedatei: DbZuCsvOderHtml.java

    package dbcsvhtml;
    
    import java.io.*;
    import java.sql.*;
    import java.text.*;
    import java.util.*;
    
    /**
     * Lies Datenbanktabellen und gib sie auf der Konsole, als CSV-Datei oder als HTML-Datei aus.
     * Die Parametrisierung erfolgt ueber Kommandozeilenparameter oder ueber eine Properties-Datei.
     */
    public class DbZuCsvOderHtml
    {
       private static final SimpleDateFormat YYYY_MM_DD_HH_MM_SS = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
    
       public static void main( String[] args )
       {
          // Lies 'Key=Value'-Paare aus Properties-Datei fuer Voreinstellungen:
          String propFile = "DbZuCsvOderHtml.properties";
          if( 0 < args.length && args[0].startsWith( "prop=" ) ) {
             propFile = args[0].substring( 5 );
          }
          Properties props = new Properties();
          try {
             props.load( new FileInputStream( propFile ) );
          } catch( FileNotFoundException ex ) {
             System.out.println( "\nWarnung: Keine Properties-Datei '" + propFile + "' fuer Voreinstellungen gefunden." );
          } catch( IOException ex ) {
             System.out.println( "\nFehler beim Lesen der Datei '" + propFile + "': " + ex.getMessage() );
          }
          // Lies 'Key=Value'-Paare aus Kommandozeilenparametern
          // (koennen Parameter aus obiger Properties-Datei ueberschreiben):
          for( int i = 0; i < args.length; i++ ) {
             int delim = args[i].indexOf( '=' );
             if( delim > 0 && delim <= args[i].length() - 2 ) {
                props.put( args[i].substring( 0, delim ), args[i].substring( delim + 1 ) );
             }
          }
          // Pruefe die wichtigsten Properties:
          String dbDrv    = props.getProperty( "dbDrv" );
          String dbUrl    = props.getProperty( "dbUrl" );
          String dbUsr    = props.getProperty( "dbUsr" );
          String sql1     = props.getProperty( "sql1"  );
          String encoding = props.getProperty( "encoding" );
          String trimStr  = props.getProperty( "trim" );
          boolean doTrim  = trimStr == null || trimStr.trim().length() == 0 || !trimStr.trim().equalsIgnoreCase( "false" );
          if( null == encoding || 0 == encoding.trim().length() ) { encoding = "UTF-8"; }
          System.out.println( "\npropFile: " + propFile + "\ndbDrv:    " + dbDrv + "\ndbUrl:    " + dbUrl + "\ndbUsr:    " + dbUsr +
                              "\nencoding: " + encoding );
          if( null == dbDrv ) { System.out.println( "Fehler: dbDrv muss gesetzt sein, z.B.: dbDrv=com.mysql.jdbc.Driver" ); }
          if( null == dbUrl ) { System.out.println( "Fehler: dbUrl muss gesetzt sein, z.B.: dbUrl=jdbc:mysql://localhost:3306/MeineDb" ); }
          if( null == sql1  ) { System.out.println( "Fehler: sql1 muss gesetzt sein, z.B.: sql1=select * from MeineTabelle" ); }
          if( dbDrv == null || dbUrl == null || sql1 == null ) { System.exit( 1 ); }
    
          // Lies Datenbanktabelle:
          Connection        cn = null;
          PreparedStatement st = null;
          ResultSet         rs = null;
          try {
             // Datenbank-Connection:
             Class.forName( dbDrv );
             cn = DriverManager.getConnection( dbUrl, dbUsr, props.getProperty( "dbPwd" ) );
             int idxSql = 0;
             while( true ) {
                // SQL-Kommando und PrepareStatement:
                String sql = props.getProperty( "sql" + ++idxSql );
                if( null == sql || 0 >= sql.trim().length() ) {
                   break;
                }
                System.out.println( "\nsql" + idxSql + ": " + sql );
                st = cn.prepareStatement( sql );
                int idxParm = 0;
                while( true ) {
                   String parm = props.getProperty( "sql" + idxSql + ".parm" + ++idxParm );
                   if( null == parm || 0 >= parm.trim().length() ) {
                      break;
                   }
                   System.out.println( "sql" + idxSql + ".parm" + idxParm + ": " + parm );
                   st.setObject( idxParm, parm );
                }
                // ResultSet zu String-Array:
                rs = st.executeQuery();
                ResultSetMetaData rsmd = rs.getMetaData();
                int i, n = rsmd.getColumnCount();
                List<List<String>> tbl = new ArrayList<List<String>>();
                List<String> row = new ArrayList<String>();
                for( i = 0; i < n; i++ ) {
                   String s = rsmd.getColumnName( i + 1 );
                   if( s != null && doTrim ) { s = s.trim(); }
                   row.add( s  );
                }
                tbl.add( row );
                while( rs.next() ) {
                   row = new ArrayList<String>();
                   for( i = 0; i < n; i++ ) {
                      Object obj = rs.getObject( i + 1 );
                      if( null != obj && obj instanceof java.sql.Date ) {
                         row.add( YYYY_MM_DD_HH_MM_SS.format( (java.sql.Date) obj ) );
                      } else {
                         String s = rs.getString( i + 1 );
                         if( s != null && doTrim ) { s = s.trim(); }
                         row.add( (s != null) ? s.replace( '\n', ' ' ) : "null" );
                      }
                   }
                   tbl.add( row );
                }
                rs.close();
                rs = null;
                st.close();
                st = null;
                // Ausgabe auf Konsole, als CSV-Datei oder als HTML-Datei:
                String console  = props.getProperty( "console" );
                String csvFile  = props.getProperty( "csvFile" );
                String htmlFile = props.getProperty( "htmlFile" );
                if( null == console || !console.equalsIgnoreCase( "false" ) ) {
                   ausgabeKonsole( tbl, 20, encoding );
                }
                if( null != csvFile && 0 < csvFile.trim().length() ) {
                   ausgabeCsv( tbl, csvFile + idxSql + ".csv", encoding );
                }
                if( null != htmlFile && 0 < htmlFile.trim().length() ) {
                   String htmlFileWithoutHtmlTag = props.getProperty( "htmlFileWithoutHtmlTag" );
                   ausgabeHtml( tbl, htmlFile + idxSql + ".html", encoding, "true".equalsIgnoreCase( htmlFileWithoutHtmlTag ) );
                }
             }
          } catch( Exception ex ) {
             System.out.println( "\nFehler beim Lesen der Datenbank: " + ex );
             ex.printStackTrace();
          } finally {
             try { if( rs != null ) { rs.close(); } } catch( Exception ex ) {/* nothing to do */}
             try { if( st != null ) { st.close(); } } catch( Exception ex ) {/* nothing to do */}
             try { if( cn != null ) { cn.close(); } } catch( Exception ex ) {/* nothing to do */}
          }
       }
    
       /** Ausgabe als CSV-Datei (Comma Separated Values, z.B. fuer Excel) */
       private static final void ausgabeCsv( List<List<String>> tbl, String csvFile, String encoding )
       {
          final String[] replStrings = { "&amp;", "&", "&euro;", "\u20AC", "&sect;", "§", "&reg;", "®",
                                         "&sup2;", "²", "&deg;", "°", "&iquest;", "¿" };
          if( tbl == null || tbl.size() == 0 || csvFile == null || csvFile.trim().length() == 0 ) {
             return;
          }
          try {
             BufferedWriter out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( csvFile ), encoding ) );
             try {
                for( List<String> row : tbl ) {
                   if( row != null ) {
                      for( String s : row ) {
                         if( s == null ) { s = ""; }
                         for( int i = 0; i < replStrings.length - 1; i += 2 ) {
                            s = s.replace( replStrings[i], replStrings[i + 1] );
                         }
                         out.write( s.replace( "\n", ", " ).replace( ';', ',' ) + ";" );
                      }
                      out.newLine();
                   }
                }
             } finally {
                out.close();
             }
             System.out.println( "\n" + csvFile + " erzeugt." );
          } catch( Exception ex ) {
             System.out.println( "\nFehler beim Erzeugen der CSV-Datei '" + csvFile + "': " + ex );
          }
       }
    
       /** Ausgabe als HTML-Datei */
       private static final void ausgabeHtml( List<List<String>> tbl, String htmlFile, String encoding, boolean htmlFileWithoutHtmlTag )
       {
          if( tbl == null || tbl.size() == 0 || htmlFile == null || htmlFile.trim().length() == 0 ) {
             return;
          }
          try {
             BufferedWriter out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( htmlFile ), encoding ) );
             try {
                int i, r, lenRow0 = tbl.get( 0 ).size();
                if( !htmlFileWithoutHtmlTag ) {
                   out.write( "<head><meta http-equiv='content-type' content='text/html;charset=" + encoding + "'></head>\n<html>\n" );
                }
                out.write( "<table border=1 cellspacing=0 cellpadding=2>\n<tr bgcolor='#EBEEEE'>" );
                for( String s : tbl.get( 0 ) ) {
                   out.write( "<th>" + s + "</th>" );
                }
                for( r = 1; r < tbl.size(); r++ ) {
                   if( tbl.get( r ) != null ) {
                      out.write( "</tr>\n<tr>" );
                      for( i = 0; i < Math.min( lenRow0, tbl.get( r ).size() ); i++ ) {
                         out.write( "<td>" + tbl.get( r ).get( i ) + "</td>" );
                      }
                   }
                }
                out.write( "</tr>\n</table>\n" );
                if( !htmlFileWithoutHtmlTag ) { out.write( "</html>\n" ); }
             } finally {
                out.close();
             }
             System.out.println( "\n" + htmlFile + " erzeugt." );
          } catch( Exception ex ) {
             System.out.println( "\nFehler beim Erzeugen der HTML-Datei '" + htmlFile + "': " + ex );
          }
       }
    
       /** Ausgabe auf Konsole (Kommandozeilenfenster) */
       private static final void ausgabeKonsole( List<List<String>> tbl, int maxZeilen, String encoding )
       {
          if( tbl == null || tbl.size() == 0 ) { return; }
          PrintWriter pw;
          try {
             pw = new PrintWriter( new OutputStreamWriter( System.out, encoding ) );
          } catch( UnsupportedEncodingException ex ) {
             pw = new PrintWriter( new OutputStreamWriter( System.out ) );
          }
          try {
             String leerString  = "                     ";
             String minusString = "---------------------";
             int i, r, maxRows = tbl.size(), lenRow0 = tbl.get( 0 ).size();
             if( maxRows > maxZeilen + 1 ) {
                maxRows = maxZeilen + 1;
                pw.println( "\nWarnung: Begrenzt auf " + (maxRows - 1) + " Zeilen.\n" );
             }
             int maxLength = 0;
             for( r = 0; r < maxRows; r++ ) {
                if( tbl.get( r ) != null ) {
                   for( i = 0; i < Math.min( lenRow0, tbl.get( r ).size() ); i++ ) {
                      String s = tbl.get( r ).get( i );
                      if( s != null && maxLength < s.length() ) {
                         maxLength = s.length();
                      }
                   }
                }
             }
             maxLength++;
             if( maxLength > leerString.length()  ) { maxLength = leerString.length();  }
             if( maxLength > minusString.length() ) { maxLength = minusString.length(); }
             leerString  = leerString.substring(  0, maxLength );
             minusString = minusString.substring( 0, maxLength );
             for( i = 0; i < lenRow0; i++ ) {
                pw.print( "+-" + minusString );
             }
             pw.println( "+" );
             for( r = 0; r < maxRows; r++ ) {
                if( tbl.get( r ) != null ) {
                   for( i = 0; i < Math.min( lenRow0, tbl.get( r ).size() ); i++ ) {
                      pw.print( "| " + extendString( tbl.get( r ).get( i ), leerString ) );
                   }
                   pw.println( "|" );
                   if( 0 == r ) {
                      for( i = 0; i < lenRow0; i++ ) {
                         pw.print( "+-" + minusString );
                      }
                      pw.println( "+" );
                   }
                }
             }
             for( i = 0; i < lenRow0; i++ ) {
                pw.print( "+-" + minusString );
             }
             pw.println( "+" );
          } finally {
             pw.flush();
          }
       }
    
       /** Verlaengere String linksbuendig auf vorgegebene Laenge */
       private static final String extendString( String s, String maxLeerString )
       {
          String si = ( s != null ) ? s : "";
          final int iWantLen = maxLeerString.length();
          final int iActLen  = si.length();
          if( iActLen <     iWantLen ) { return (si + maxLeerString).substring( 0, iWantLen ); }
          if( iActLen > 2 * iWantLen ) { return si.substring( 0, 2 * iWantLen ); }
          return si;
       }
    }
    
  7. Erzeugen Sie im DbZuCsvOderHtml-Projektverzeichnis folgende Properties-Datei (passen Sie die Parameter an Ihre Datenbank und Tabellen an): DbZuCsvOderHtml.properties

    console=true
    csvFile=MeineCsvDatei
    htmlFile=MeineHtmlDatei
    htmlFileWithoutHtmlTag=false
    dbDrv=com.mysql.jdbc.Driver
    dbUrl=jdbc:mysql://192.168.178.32:3306/MeineDb
    dbUsr=root
    dbPwd=mysqlpwd
    sql1=select * from MeineTestTabelle
    sql2=select i, c, s from MeineTestTabelle where i <= ?
    sql2.parm1=12
    
  8. Ihr Projektverzeichnis sieht jetzt folgendermaßen aus:

    [\MeinWorkspace]
      '- [DbZuCsvOderHtml]
           |- [bin]
           |- [lib]
           |    |- mysql-connector-java-5.1.16-bin.jar   [falls MySQL]
           |    '- ojdbc6.jar                            [falls Oracle-DB]
           |- [src]
           |    '- [dbcsvhtml]
           |         '- DbZuCsvOderHtml.java
           '- DbZuCsvOderHtml.properties
    
  9. Kompilation und Ausführung können folgendermaßen im Kommandozeilenfenster aus dem Projektverzeichnis 'DbZuCsvOderHtml' heraus erfolgen:

    cd \MeinWorkspace\DbZuCsvOderHtml

    javac -cp .;bin;lib/* -d bin src/dbcsvhtml/*.java

    java -cp .;bin;lib/* dbcsvhtml.DbZuCsvOderHtml

    dir

    type MeineCsvDatei1.csv

    type MeineHtmlDatei1.html

    start MeineCsvDatei1.csv

    start MeineCsvDatei2.csv

    start MeineHtmlDatei1.html

    start MeineHtmlDatei2.html

  10. Falls Sie eine Datenbanktabelle wie unter 'MeineTestTabelle' beschrieben eingerichtet haben, erhalten Sie beispielsweise folgendes Ergebnis:

    propFile: DbZuCsvOderHtml.properties
    dbDrv:    com.mysql.jdbc.Driver
    dbUrl:    jdbc:mysql://192.168.178.32:3306/MeineDb
    dbUsr:    root
    encoding: UTF-8
    
    sql1: select * from MeineTestTabelle
    +------------+------------+------------+------------+
    | i          | c          | s          | dt         |
    +------------+------------+------------+------------+
    | 11         | ABC        | Blubb      | 2000-01-01 |
    | 12         | ab         | Blabla     | 2000-12-31 |
    | 42         | xy         | äöüß§€     | 2005-06-06 |
    +------------+------------+------------+------------+
    MeineCsvDatei1.csv erzeugt.
    MeineHtmlDatei1.html erzeugt.
    
    sql2: select i, c, s from MeineTestTabelle where i <= ?
    sql2.parm1: 12
    +--------+--------+--------+
    | i      | c      | s      |
    +--------+--------+--------+
    | 11     | ABC    | Blubb  |
    | 12     | ab     | Blabla |
    +--------+--------+--------+
    MeineCsvDatei2.csv erzeugt.
    MeineHtmlDatei2.html erzeugt.
    

    Auch wenn der Datenbank-String "äöüß§€" korrekt aus der Datenbank ausgelesen wird, kann er je nach Betriebssystem, Ablaufumgebung und vorgegebenem Encoding eventuell falsch dargestellt werden.

    Zum Beispiel erhalten Sie im Windows-Kommandozeilenfenster einen völlig anderen String (bei UTF-8 sogar einen zu langen String wegen der Mehrfachbytes). Bis auf das in der Cp850-Codepage nicht darstellbare €-Zeichen erhalten Sie korrekte Zeichen im Windows-Kommandozeilenfenster bei westeuropäischer Windows-Einstellung mit:

    java -cp .;bin;lib/* dbcsvhtml.DbZuCsvOderHtml "encoding=Cp850"

    Allerdings wird Cp850 außer im Windows-Kommandozeilenfenster sonst nirgendwo verwendet.

    Sinnvolle Encoding-Einstellungen können sein:
    UTF-8, windows-1252 und ISO-8859-15, alle mit €-Zeichen,
    ISO-8859-1 ohne €-Zeichen, aber sehr verbreitet,
    US-ASCII ohne €-Zeichen und ohne Umlaute und Sonderzeichen.

    Sehen Sie sich die Erläuterungen zu Encodings an.

  11. Wenn Sie das Kommando

    java -cp .;bin;lib/* dbcsvhtml.DbZuCsvOderHtml "sql1=select s from MeineTestTabelle where c = 'ab'" "sql2= "

    eingeben, werden Voreinstellungen der Properties-Datei überschrieben und Sie erhalten:

    sql1: select s from MeineTestTabelle where c = 'ab'
    +--------+
    | s      |
    +--------+
    | Blabla |
    +--------+
    MeineCsvDatei1.csv erzeugt.
    MeineHtmlDatei1.html erzeugt.
    
  12. Wie gezeigt können Sie die Konfigurationsparameter über die Kommandozeile oder in der Properties-Datei definieren. In beiden Fällen setzen Sie die Parameter über 'Key=Value'-Paare. Bei gleichen Keys setzen sich Kommandozeilenparameter durch. Die einzelnen Parameter bedeuten:

    Konfigurationsparameter
    prop Dateiname der zu verwendenen Properties-Datei, (z.B. 'prop=DbZuCsvOderHtml.properties');
    Dieser Parameter macht nur auf der Kommandozeile Sinn und muss dort der erste Parameter sein;
    Falls Pfade vorangestellt werden: Der Backslash '\' unter Windows muss doppelt geschrieben werden
    console true: Datenbanktabelle wird im Kommandozeilenfenster ausgegeben
    csvFile Dateiname (ohne Extension) für CSV-Datei, falls CSV-Datei erstellt werden soll;
    Falls Pfade vorangestellt werden: Der Backslash '\' unter Windows muss doppelt geschrieben werden
    htmlFile Dateiname (ohne Extension) für HTML-Datei, falls HTML-Datei erstellt werden soll;
    Falls Pfade vorangestellt werden: Der Backslash '\' unter Windows muss doppelt geschrieben werden
    htmlFileWithoutHtmlTag  true: In die HTML-Datei wird nur das HTML-Tabellencode-Fragment erzeugt, ohne umschließendes '<html>'-Tag
    (Fragmentdatei kann dann mit Vor- und Nachspanndatei zusammenkopiert werden)
    encoding Encoding der erzeugten Dateien und der Konsolenausgabe, z.B. 'UTF-8', 'ISO-8859-1', 'windows-1252' oder 'US-ASCII'
    trim Wenn dieser Wert nicht auf 'false' gesetzt wird, werden führende und nachfolgende Leerzeichen entfernt
    dbDrv JDBC-Treiberklasse, z.B. 'com.mysql.jdbc.Driver'
    dbUrl URL der SQL-Datenbank, z.B. 'jdbc:mysql://192.168.178.32:3306/MeineDb'
    dbUsr Datenbank-Benutzername
    dbPwd Datenbank-Kennwort
    sql1
    sql2
    ...
    SQL-Kommandos, können wahlweise parameterlose SQL-Kommandos sein
    (z.B. '
    select * from MeineTabelle'),
    oder zu parametrisierende SQL-Kommandos
    (z.B. '
    select * from MeineTabelle where i <= ?')
    sql_.parm1
    sql_.parm2
    ...
    Die einzelnen Parameter falls zu parametrisierendes SQL-Kommando
    (den Unterstrich '_' durch die Nummer des passenden SQL-Kommandos ersetzen)


Lesen großer Tabellen aus SQL-Datenbank in CSV-Datei

Beim obigen Beispiel wird der selektierte DB-Tabelleninhalt in String-Listen geladen und kann anschließend flexibel weiterverarbeitet oder ausgegeben werden. Dies funktioniert allerdings so nur, wenn die gelesenen Strings alle in den zur Verfügung stehenden RAM-Speicher passen.

Wenn Sie große DB-Tabellen in CSV-Dateien speichern wollen, müssen Sie zeilenweise lesen und speichern, wie es das folgende Beispiel zeigt.

Die Parametrisierung erfolgt genau so wie beim letzten Beispiel per Kommandozeile oder über eine Properties-Datei.

  1. Erzeugen Sie die im obigen Beispiel gezeigte Verzeichnisstruktur.

  2. Erzeugen Sie im src\dbcsvhtml-Verzeichnis folgende Java-Sourcedatei: DbZuCsv.java

    package dbcsvhtml;
    
    import java.io.*;
    import java.sql.*;
    import java.text.SimpleDateFormat;
    import java.util.Properties;
    
    /**
     * Lies Datenbanktabellen und gib sie als CSV-Datei aus.
     * Die Parametrisierung erfolgt ueber Kommandozeilenparameter oder ueber eine Properties-Datei.
     */
    public class DbZuCsv
    {
       private static final SimpleDateFormat YYYY_MM_DD_HH_MM_SS = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
    
       public static void main( String[] args )
       {
          // Lies 'Key=Value'-Paare aus Properties-Datei fuer Voreinstellungen:
          String propFile = "DbZuCsv.properties";
          if( 0 < args.length && args[0].startsWith( "prop=" ) ) {
             propFile = args[0].substring( 5 );
          }
          Properties props = new Properties();
          try {
             props.load( new FileInputStream( propFile ) );
          } catch( FileNotFoundException ex ) {
             System.out.println( "\nWarnung: Keine Properties-Datei '" + propFile + "' fuer Voreinstellungen gefunden." );
          } catch( IOException ex ) {
             System.out.println( "\nFehler beim Lesen der Datei '" + propFile + "': " + ex.getMessage() );
          }
          // Lies 'Key=Value'-Paare aus Kommandozeilenparametern
          // (koennen Parameter aus obiger Properties-Datei ueberschreiben):
          for( int i = 0; i < args.length; i++ ) {
             int delim = args[i].indexOf( '=' );
             if( delim > 0 && delim <= args[i].length() - 2 ) {
                props.put( args[i].substring( 0, delim ), args[i].substring( delim + 1 ) );
             }
          }
          // Pruefe die wichtigsten Properties:
          String dbDrv    = props.getProperty( "dbDrv" );
          String dbUrl    = props.getProperty( "dbUrl" );
          String dbUsr    = props.getProperty( "dbUsr" );
          String sql1     = props.getProperty( "sql1"  );
          String csvFile  = props.getProperty( "csvFile"  );
          String encoding = props.getProperty( "encoding" );
          String trimStr  = props.getProperty( "trim" );
          boolean doTrim  = trimStr == null || trimStr.trim().length() == 0 || !trimStr.trim().equalsIgnoreCase( "false" );
          if( null == csvFile  || 0 == csvFile.trim().length()  ) { csvFile  = "MeineCsvDatei"; }
          if( null == encoding || 0 == encoding.trim().length() ) { encoding = "UTF-8"; }
          System.out.println( "\npropFile: " + propFile + "\ndbDrv:    " + dbDrv + "\ndbUrl:    " + dbUrl + "\ndbUsr:    " + dbUsr +
                              "\nencoding: " + encoding );
          if( null == dbDrv ) { System.out.println( "Fehler: dbDrv muss gesetzt sein, z.B.: dbDrv=com.mysql.jdbc.Driver" ); }
          if( null == dbUrl ) { System.out.println( "Fehler: dbUrl muss gesetzt sein, z.B.: dbUrl=jdbc:mysql://localhost:3306/MeineDb" ); }
          if( null == sql1  ) { System.out.println( "Fehler: sql1 muss gesetzt sein, z.B.: sql1=select * from MeineTabelle" ); }
          if( dbDrv == null || dbUrl == null || sql1 == null ) { System.exit( 1 ); }
    
          // Lies Datenbanktabelle und schreibe in CSV-Datei:
          Connection        cn = null;
          PreparedStatement st = null;
          ResultSet         rs = null;
          try {
             // Datenbank-Connection:
             Class.forName( dbDrv );
             cn = DriverManager.getConnection( dbUrl, dbUsr, props.getProperty( "dbPwd" ) );
             int idxSql = 0;
             while( true ) {
                // SQL-Kommando und PrepareStatement:
                String sql = props.getProperty( "sql" + ++idxSql );
                if( null == sql || 0 >= sql.trim().length() ) {
                   break;
                }
                System.out.println( "\nsql" + idxSql + ": " + sql );
                st = cn.prepareStatement( sql );
                int idxParm = 0;
                while( true ) {
                   String parm = props.getProperty( "sql" + idxSql + ".parm" + ++idxParm );
                   if( null == parm || 0 >= parm.trim().length() ) {
                      break;
                   }
                   System.out.println( "sql" + idxSql + ".parm" + idxParm + ": " + parm );
                   st.setObject( idxParm, parm );
                }
                // CSV-Datei:
                String csvFileN = csvFile + idxSql + ".csv";
                BufferedWriter out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( csvFileN ), encoding ) );
                try {
                   // ResultSet:
                   rs = st.executeQuery();
                   ResultSetMetaData rsmd = rs.getMetaData();
                   int i, n = rsmd.getColumnCount();
                   for( i = 0; i < n; i++ ) {
                      out.write( correctString( rsmd.getColumnName( i + 1 ), doTrim ) + ";" );
                   }
                   out.newLine();
                   while( rs.next() ) {
                      for( i = 0; i < n; i++ ) {
                         Object obj = rs.getObject( i + 1 );
                         if( null != obj && obj instanceof java.sql.Date ) {
                            out.write( correctString( YYYY_MM_DD_HH_MM_SS.format( (java.sql.Date) obj ), doTrim ) + ";" );
                         } else {
                            out.write( correctString( rs.getString( i + 1 ), doTrim ) + ";" );
                         }
                      }
                      out.newLine();
                   }
                } finally {
                   out.close();
                }
                System.out.println( "\n" + csvFileN + " erzeugt." );
                rs.close();
                rs = null;
                st.close();
                st = null;
             }
          } catch( Exception ex ) {
             System.out.println( "\nFehler beim Lesen der Datenbank oder beim Erzeugen der CSV-Datei '" + csvFile + "': " + ex );
             ex.printStackTrace();
          } finally {
             try { if( rs != null ) { rs.close(); } } catch( Exception ex ) {/* nothing to do */}
             try { if( st != null ) { st.close(); } } catch( Exception ex ) {/* nothing to do */}
             try { if( cn != null ) { cn.close(); } } catch( Exception ex ) {/* nothing to do */}
          }
       }
    
       /** Ersetze Semikolons */
       private static final String correctString( String s, boolean doTrim )
       {
          final String[] replStrings = { "&amp;", "&", "&euro;", "\u20AC", "&sect;", "§", "&reg;", "®",
                                         "&sup2;", "²", "&deg;", "°", "&iquest;", "¿" };
          String si = ( s == null ) ? "" : ( doTrim ) ? s.trim() : s;
          for( int i = 0; i < replStrings.length - 1; i += 2 ) {
             si = si.replace( replStrings[i], replStrings[i + 1] );
          }
          return si.replace( "\n", ", " ).replace( ';', ',' );
       }
    }
    
  3. Die Kompilation und Ausführung erfolgt analog wie beim letzten Beispiel:

    cd \MeinWorkspace\DbZuCsvOderHtml

    javac -cp .;bin;lib/* -d bin src/dbcsvhtml/*.java

    java -cp .;bin;lib/* dbcsvhtml.DbZuCsv

    dir





Weitere Themen: andere TechDocs | SQL | SQL mit Java | TXT zu CSV und XML
© 1998-2011 Torsten Horn, Aachen