package de.superx.bin; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import de.memtext.util.GetOpts; public class DelEndChar { /* Klassenvariablen */ private static String _dateiPfad = ""; private static String DELIMITER = "^"; private static String _outDateiPfad=""; private static String _tabelle=""; /** * Diese Klasse bereinigt die Zeilen der angegebenen ASCII-Dateien
* Es wird der letzte Delimiter-Zeichen aus jeder Zeile entfernt.
* Parameter:
* 1. Eingabe-Dateiname mit Pfadangabe
* 2. Ausgabe-Dateiname mit Pfadangabe
* 3. Delimiter-Zeichen(optional).
* 4. Tabellenname in der Datenbank, der auf Übereistimmung der Felderanzahl geprüft werden soll (optional).
* Defaultwert für Delimiter ist ^. * Aufruf: java -cp .:../lib/superx-db.jar:../lib/<>.jar delEndChar * @version 0.1 4.7.2003 * @author Eugen Ermantraut */ public DelEndChar() { } public static void main(String[] args) { DelEndChar r = new DelEndChar(); GetOpts.setOpts(args); String isdrin= GetOpts.isAllRequiredOptionsPresent("-IN"); if(isdrin != null) { System.err.println("Datei-Pfade werden als Parameter erwartet. Folgende Optionen fehlen: " + isdrin); r.zeige_hilfe(); System.exit(1); } //GetOpts myOpts=new GetOpts(); if (GetOpts.isPresent("-IN")) _dateiPfad=GetOpts.getValue("-IN" ); if (GetOpts.isPresent("-OUT")) _outDateiPfad=GetOpts.getValue("-OUT" ); if (GetOpts.isPresent("-delim")) DELIMITER=GetOpts.getValue("-delim" ); if (GetOpts.isPresent("-table")) _tabelle=GetOpts.getValue("-table" ); if (args[0].toString().equals("?") || args[0].toString().equals("/?") || args[0].toString().equals("\\?") || args[0].toString().toLowerCase().equals("-h") || args[0].toString().toLowerCase().equals("--h") ) { r.zeige_hilfe(); System.exit(1); } //if (r.check_param_ok(args)) //{ try { r.updateFile(r._dateiPfad, r._outDateiPfad); System.out.println("Datei: " + r._dateiPfad + " nach " + r._outDateiPfad+ " umgesetzt"); } catch (Exception e) { System.err.println(e.toString()); } //} } // Ende der Methode private void updateFile(String inDateiPfad, String outDateiPfad) throws IOException, Exception { File f = new File(inDateiPfad); if (!f.exists()) { throw new Exception("Datei nicht gefunden: " + inDateiPfad); } BufferedReader in; BufferedWriter out; //--- File-Instanz für temporäre Ergebnis-Datei anlegen ---// File out_tmp; out_tmp = new File(inDateiPfad+".tmp2"); //--- IputStream und OutputStream generieren ---// in = new BufferedReader(new InputStreamReader( new FileInputStream(f) )); //--- Output-Stream der tämporere Datei erzeugen ---// out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(out_tmp) )); //--- Verarbeiten der Datei ---// String text; String tt; text = in.readLine(); if(text!=null) { //Datei nicht leer if(text.endsWith("\\")) { tt=in.readLine(); if(tt!=null) { text+=tt; while(tt.endsWith( "\\")) { tt= in.readLine(); if(tt != null) text +=tt+"\n"; //(tt.substring(0,tt.length())); } } } if(!_tabelle.equals("") && !_tabelle.equals("null") ) { //Die Datei ist eine entladene Tabelle //int start=_dateiPfad.indexOf("_",_dateiPfad.length()-4); //if(start <0 ) // start=0; // String tabname=_dateiPfad.substring(start,_dateiPfad.length()-4); int numFelder=0; //System.out.println("Tabelle "+_tabelle+ " DELIM " + DELIMITER); try { numFelder= SxDBUtils.fieldCount(_tabelle); //System.out.println("Felderanzahl:"+numFelder); } catch (Exception e) { System.err.println("Fehler beim Abfragen der Tabellen-Metadaten: " + e.toString()); } int k=0; int i=0; int p=0; do { p=text.indexOf(DELIMITER,i); if(p>0) { k++; i=p+1; } } while (p>0); if(k!=numFelder) { throw new Exception("unl-Datei entspricht nicht der Tabelle in der Datenbank;\nDie Tabelle hat "+numFelder+" Felder, die unl-Datei hat "+k +" Felder "); } } //Wenn Tabelle gecheckt werden sollte do { if (text == null) break; if(text.endsWith("\\")) { tt= in.readLine(); if(tt != null) { text += tt; while(tt != null && tt.endsWith( "\\")) { //Umbrüche aus Informix-Lognvarchars abfangen tt= in.readLine(); if(tt != null) text +=tt+"\n"; //(tt.substring(0,tt.length())); } } } text = reorgString(text.trim()); if (text == "-0") // Rohdatendatei Formatfehler { throw new Exception("Datei: " + inDateiPfad + " hat falsches Format: "); } out.write(text,0,text.length()); out.write("\n"); // muss NeuLine schreiben das die Zeile ohne eingelesen wird out.flush(); text = in.readLine(); }while (text!=null); } //Wenn Datei nicht leer war. in.close(); out.close(); //--- Umbenennen Quell-Dateien ---// /*String alt = inDateiPfad + ".in"; File altFile = new File(alt); if (altFile.exists()) altFile.delete(); f.renameTo(altFile);*/ //--- Umformatierte temporäre Datei unter dem ursprünglichen Namen ablegen ---// File neuFile = new File(outDateiPfad); out_tmp.renameTo(neuFile); //--- Berechtigung für die neu angelegete Datei neu Vergeben ---// if (!chmode("u=rw,g=rw,o=rw", outDateiPfad)) { System.out.println("Kann Berechtigung nicht ändern " + outDateiPfad); } //--- Schliessen der Streams und Löschen der temporären Datei ---// in.close(); out.close(); out_tmp.delete(); }//Ende der Methode private boolean chmode(String inBerechtigung,String inDat) { String befehl = "chmod "+ inBerechtigung + " " + inDat; try { Runtime r = Runtime.getRuntime(); Process p = r.exec(befehl); int exitCode = p.waitFor(); } catch(Exception e) { System.out.println("Error: " + e.toString()); return false; } return true; }//Ende der Methode /** * Liefert den Teilsstring von 0 bis zu letzten Delimiterzeichen(Exclusive) * @param inS * @return String */ private String reorgString(String inS) throws Exception { int ldPos = inS.lastIndexOf(DELIMITER); //--- Wenn Delimiter-Zeichen nicht letztes Zeichen im String ist, //--- muss die Verarbeitung abgebrochen werden---// if ((ldPos + 1) < inS.length() || ldPos== -1) //throw new Exception("Datei ist bereits umgesetzt!"); return inS; else return inS.substring(0,ldPos); }//Ende der Methode public boolean check_param_ok(String[] inTab) { //--- Anzahl der übergebenen Parameter prüfen ---// //System.out.println(inTab.length); if (inTab.length < 2 ) { System.out.println("Mindestens 2 Parameter erwartet! Mit -h oder ? rufen sie Hilfe auf."); return false; } //--- Dateinpfad übernehmen ---// _dateiPfad = inTab[0].trim(); _outDateiPfad = inTab[1].trim(); if (inTab.length >=3 ) DELIMITER = inTab[2].trim(); //---Wenn Delimiter-Zeichen übergeben wurde dann übernehmen ---// if (inTab.length >3 ) _tabelle = inTab[3].toString().trim(); return true; }//Ende der Methode /** * Prüfen der Datei auf Vorhandensein und Leseberechrigung * @param inFile */ private boolean check_Directory(File inFile) { if (inFile.exists()) { if (!inFile.isDirectory()) { System.out.println(inFile + " ist kein Verzeichnis!"); return false; } } else { System.out.println(inFile + " Verzeichniss nicht gefunden!"); return false; } return true; }//Ende der Methode private void progEnde() { System.runFinalization(); System.exit(0); }//Ende der Methode private void zeige_hilfe() { System.out.println("\n Diese Klasse bereinigt die Zeilen der angegebenen ASCII-Dateien."); System.out.println(" Es wird der letzte Delimeter-Zeichen aus jeder Zeile entfernt."); System.out.println("\n Parameter: "); System.out.println("1. Eingabe-Dateiname mit Pfadangabe "); System.out.println("2. Ausgabe-Dateiname mit Pfadangabe"); System.out.println("3. Delimiter-Zeichen(optional)"); System.out.println("4. Tabellenname in der Datenbank, der auf Übereistimmung der Felderanzahl geprüft werden soll (optional, wenn keine Überprüfung, dann 'none')."); //System.out.println(" Wenn in einer Zeile Zeichen hinter dem letzten Delimiter-Zeichen "); //System.out.println(" wird die Bearbeitung abgebrochen, da es anzunehmen ist daß diese Datei"); //System.out.println(" bereits umgesetzt ist!"); System.out.println(" Defaultwert fuer Delimiter ist ^. \n" ); }// Ende der Methode }//Ende der Klasse