SQL-Datenbank zu HTML und CSV

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


Diese Programmierbeispiele lesen über konfigurierbare SQL-Kommandos Datenbankinhalte und geben den Inhalt auf der Konsole aus, erzeugen eine HTML-Datei und eine in Excel ladbare CSV-Datei (Comma Separated Values).



Inhalt

  1. Ausgabe von Datenbanktabellen auf der Konsole sowie als HTML- und CSV-Datei
  2. Lesen großer Tabellen aus einer Datenbank in eine CSV-Datei


Ausgabe von Datenbanktabellen auf der Konsole sowie als HTML- und CSV-Datei

  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:

    md \MeinWorkspace\DbZuCsvOderHtml

    cd \MeinWorkspace\DbZuCsvOderHtml

    md bin

    md lib

    md src\dbcsvhtml

  4. Das Beispiel benötigt eine Datenbank. Falls Sie noch keine installiert haben, können Sie beispielsweise MySQL (z.B. wie beschrieben unter: mysql.htm#InstallationUnterWindows) oder die Oracle Database (z.B. wie beschrieben unter: oraclexe-db.htm) installieren.
    Weiterhin wird eine Datenbanktabelle mit Inhalt erwartet. Für MySQL können Sie zum Beispiel als 'Database-Name' "MeineDb" wählen ('CREATE DATABASE MeineDb;') und eine Test-Datenbanktabelle füllen, wie z.B. für 'MeineTestTabelle' gezeigt.
    Sie können das Beispiel natürlich auch für beliebige andere Datenbanken, Database-Namen und Tabellen verwenden, indem Sie die entsprechenden Parameter in der unten gezeigten DbZuCsvOderHtml.properties konfigurieren.

  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: ojdbc7.jar.

  6. Bitte beachten Sie: Dieses Beispiel ist nur geeignet, wenn die gelesenen Inhalte komplett ins RAM passen. Wenn Sie größere Datenbanktabellen lesen wollen, verwenden Sie bitte das andere weiter unten gezeigte Beispiel DbZuCsv.java.

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

    package dbcsvhtml;
    
    import java.io.*;
    import java.sql.*;
    import java.text.SimpleDateFormat;
    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 )
       {
          // Ermittle uebergebene Parameter aus Properties-Datei und aus Kommandozeile:
          Properties parms = getParms( args, "DbZuCsvOderHtml.properties" );
    
          // Pruefe die wichtigsten Properties:
          String  csvToHtmlFile = parms.getProperty( "csvToHtmlFile" );
          String  dbDrv         = parms.getProperty( "dbDrv" );
          String  dbUrl         = parms.getProperty( "dbUrl" );
          String  dbUsr         = parms.getProperty( "dbUsr" );
          String  sql1          = parms.getProperty( "sql1"  );
          String  encoding      = parms.getProperty( "encoding" );
          String  noTrimStr     = parms.getProperty( "noTrim" );
          boolean noTrim        = noTrimStr != null && noTrimStr.trim().length() > 0 && noTrimStr.trim().equalsIgnoreCase( "true" );
          if( null == encoding || 0 == encoding.trim().length() ) { encoding = "UTF-8"; }
    
          // Nicht DB lesen, sondern CSV-Datei in HTML-Datei konvertieren?
          if( csvToHtmlFile != null && csvToHtmlFile.length() > 0 ) {
             System.out.println( "\npropFile     : " + parms.getProperty( "propFile" ) + "\ncsvToHtmlFile: " + csvToHtmlFile + "\nencoding     : " + encoding );
             try {
                csvToHtml( csvToHtmlFile, encoding, ";" );
             } catch( IOException ex ) {
                System.out.println( "\nFehler beim Lesen oder Schreiben der Datei '" + csvToHtmlFile + "': " + ex.getMessage() );
             }
             if( dbDrv == null && dbUrl == null && sql1 == null ) {
                return;
             }
          }
    
          // Aus DB lesen:
          System.out.println( "\npropFile: " + parms.getProperty( "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, parms.getProperty( "dbPwd" ) );
             int idxSql = 0;
             while( true ) {
                // SQL-Kommando und PrepareStatement:
                String sql = parms.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 = parms.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 && !noTrim ) { 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 && !noTrim ) { 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  = parms.getProperty( "console" );
                String csvFile  = parms.getProperty( "csvFile" );
                String htmlFile = parms.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 = parms.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 */}
          }
       }
    
       /** Ermittle uebergebene Parameter aus Properties-Datei und aus Kommandozeile */
       private static final Properties getParms( String[] args, String propFileDefault )
       {
          // Lies 'Key=Value'-Paare aus Properties-Datei fuer Voreinstellungen:
          String propFile = ( args.length > 0 && args[0].startsWith( "prop=" ) ) ? args[0].substring( 5 ) : propFileDefault;
          Properties parms = new Properties();
          InputStream in = null;
          try {
             in = new FileInputStream( propFile );
             parms.load( in );
             parms.setProperty( "propFile", 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() );
          } finally {
             try { if( in != null ) { in.close(); } } catch( IOException e ) {/* nothing to do */}
          }
          // 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 ) {
                parms.put( args[i].substring( 0, delim ), args[i].substring( delim + 1 ) );
             }
          }
          return parms;
       }
    
       /** Wandle CSV-Datei (Comma Separated Values) in HTML-Datei */
       private static final void csvToHtml( String csvDatei, String encoding, String delimiter ) throws IOException
       {
          List<List<String>> tbl = new ArrayList<List<String>>();
          BufferedReader in = new BufferedReader( new InputStreamReader( new FileInputStream( csvDatei ), encoding ) );
          try {
             String line;
             while( (line = in.readLine()) != null ) {
                tbl.add( Arrays.asList( line.split( delimiter ) ) );
             }
          } finally {
             in.close();
          }
          ausgabeHtml( tbl, csvDatei + ".html", encoding, false );
       }
    
       /** Ausgabe als CSV-Datei (Comma Separated Values, z.B. fuer Excel) */
       private static final void ausgabeCsv( List<List<String>> tbl, String csvFile, String encoding )
       {
          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 ) {
                         out.write( correctStringForCsv( s, true ) + ";" );
                      }
                      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;
       }
    
       /** Ersetze Semikolons und bestimmte Sonderzeichen */
       private static final String correctStringForCsv( String s, boolean noTrim )
       {
          final String[] replStrings = { ";", ",", "\n", ". ", "&amp;", "&", "&euro;", "\u20AC", "&sect;", "§",
                                         "&reg;", "®", "&sup2;", "²", "&deg;", "°", "&iquest;", "¿" };
          String si = ( s == null ) ? "" : ( noTrim ) ? s : s.trim();
          for( int i = 0; i < replStrings.length - 1; i += 2 ) {
             si = si.replace( replStrings[i], replStrings[i + 1] );
          }
          return si;
       }
    }
    
  8. Erzeugen Sie im DbZuCsvOderHtml-Projektverzeichnis folgende Properties-Datei (passen Sie die Parameter an Ihre Datenbank und Tabellen an): DbZuCsvOderHtml.properties

    Beispiel für MySQL:     Beispiel für Oracle XE:
    console=true
    csvFile=MeineCsvDatei
    htmlFile=MeineHtmlDatei
    htmlFileWithoutHtmlTag=false
    dbDrv=com.mysql.jdbc.Driver
    dbUrl=jdbc:mysql://localhost:3306/MeineDb
    dbUsr=root
    dbPwd=mysqlpwd
    sql1=select * from MeineTestTabelle
    sql2=select i, c, s from MeineTestTabelle where i <= ?
    sql2.parm1=12
    
       
    console=true
    csvFile=MeineCsvDatei
    htmlFile=MeineHtmlDatei
    htmlFileWithoutHtmlTag=false
    dbDrv=oracle.jdbc.OracleDriver
    dbUrl=jdbc:oracle:thin:@localhost:1521:XE
    dbUsr=MeinBenutzername
    dbPwd=TEMP
    sql1=select * from MeineTestTabelle
    sql2=select i, c, s from MeineTestTabelle where i <= ?
    sql2.parm1=12
    

    Erläuterungen zu den Properties finden Sie unten.

  9. Ihr Projektverzeichnis sieht jetzt folgendermaßen aus:

    [\MeinWorkspace]
      '- [DbZuCsvOderHtml]
           |- [bin]
           |- [lib]
           |    |- mysql-connector-java-5.1.16-bin.jar   [falls MySQL]
           |    '- ojdbc7.jar                            [falls Oracle-DB]
           |- [src]
           |    '- [dbcsvhtml]
           |         '- DbZuCsvOderHtml.java
           '- DbZuCsvOderHtml.properties
    
  10. 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

  11. 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://localhost: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.

  12. 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.
    
  13. 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'
    noTrim Wenn dieser Wert nicht auf 'true' gesetzt wird, werden führende und nachfolgende Leerzeichen entfernt
    dbDrv JDBC-Treiberklasse, z.B. 'com.mysql.jdbc.Driver' oder 'oracle.jdbc.OracleDriver'
    dbUrl URL der SQL-Datenbank, z.B. 'jdbc:mysql://localhost:3306/MeineDb' oder 'jdbc:oracle:thin:@localhost:1521:XE'
    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)
    csvToHtmlFile Alternative Betriebsart: Die angegebene CSV-Datei wird in eine HTML-Datei konvertiert


Lesen großer Tabellen aus einer Datenbank in eine 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 (inklusive des JDBC-Treibers und der Properties-Datei DbZuCsvOderHtml.properties).

  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 )
       {
          // Ermittle uebergebene Parameter aus Properties-Datei und aus Kommandozeile:
          Properties parms = getParms( args, "DbZuCsv.properties" );
    
          // Pruefe die wichtigsten Properties:
          String  dbDrv     = parms.getProperty( "dbDrv"    );
          String  dbUrl     = parms.getProperty( "dbUrl"    );
          String  dbUsr     = parms.getProperty( "dbUsr"    );
          String  sql1      = parms.getProperty( "sql1"     );
          String  csvFile   = parms.getProperty( "csvFile"  );
          String  encoding  = parms.getProperty( "encoding" );
          String  noTrimStr = parms.getProperty( "noTrim"   );
          boolean noTrim    = noTrimStr != null && noTrimStr.trim().length() > 0 && noTrimStr.trim().equalsIgnoreCase( "true" );
          if( null == csvFile  || 0 == csvFile.trim().length()  ) { csvFile  = "MeineCsvDatei"; }
          if( null == encoding || 0 == encoding.trim().length() ) { encoding = "UTF-8"; }
          System.out.println( "\npropFile: " + parms.getProperty( "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, parms.getProperty( "dbPwd" ) );
             int idxSql = 0;
             while( true ) {
                // SQL-Kommando und PrepareStatement:
                String sql = parms.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 = parms.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( correctStringForCsv( rsmd.getColumnName( i + 1 ), noTrim ) + ";" );
                   }
                   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( correctStringForCsv( YYYY_MM_DD_HH_MM_SS.format( (java.sql.Date) obj ), noTrim ) + ";" );
                         } else {
                            out.write( correctStringForCsv( rs.getString( i + 1 ), noTrim ) + ";" );
                         }
                      }
                      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 */}
          }
       }
    
       /** Ermittle uebergebene Parameter aus Properties-Datei und aus Kommandozeile */
       private static final Properties getParms( String[] args, String propFileDefault )
       {
          // Lies 'Key=Value'-Paare aus Properties-Datei fuer Voreinstellungen:
          String propFile = ( args.length > 0 && args[0].startsWith( "prop=" ) ) ? args[0].substring( 5 ) : propFileDefault;
          Properties parms = new Properties();
          InputStream in = null;
          try {
             in = new FileInputStream( propFile );
             parms.load( in );
             parms.setProperty( "propFile", 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() );
          } finally {
             try { if( in != null ) { in.close(); } } catch( IOException e ) {/* nothing to do */}
          }
          // 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 ) {
                parms.put( args[i].substring( 0, delim ), args[i].substring( delim + 1 ) );
             }
          }
          return parms;
       }
    
       /** Ersetze Semikolons und bestimmte Sonderzeichen */
       private static final String correctStringForCsv( String s, boolean noTrim )
       {
          final String[] replStrings = { ";", ",", "\n", ". ", "&amp;", "&", "&euro;", "\u20AC", "&sect;", "§",
                                         "&reg;", "®", "&sup2;", "²", "&deg;", "°", "&iquest;", "¿" };
          String si = ( s == null ) ? "" : ( noTrim ) ? s : s.trim();
          for( int i = 0; i < replStrings.length - 1; i += 2 ) {
             si = si.replace( replStrings[i], replStrings[i + 1] );
          }
          return si;
       }
    }
    
  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