308 lines
9.6 KiB
308 lines
9.6 KiB
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<br> |
|
* Es wird der letzte Delimiter-Zeichen aus jeder Zeile entfernt.<br> |
|
* Parameter:<br> |
|
* 1. Eingabe-Dateiname mit Pfadangabe <br> |
|
* 2. Ausgabe-Dateiname mit Pfadangabe<br> |
|
* 3. Delimiter-Zeichen(optional).<br> |
|
* 4. Tabellenname in der Datenbank, der auf Übereistimmung der Felderanzahl geprüft werden soll (optional).<br> |
|
* Defaultwert für Delimiter ist ^. |
|
* Aufruf: java -cp .:../lib/superx-db.jar:../lib/<<jdbc-Treiber>>.jar delEndChar <Dateiname> <Zieldateiname> <opt. Delimiter-Zeichen> <opt. Tabellenname> |
|
* @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
|