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