Gezielte Infos aus Datei holen - Suche nach Position/Wort

  • Themenstarter Themenstarter Louis2
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
L

Louis2

Gast
Ich habe eine Datei mit sehr viele Zeilen die wie folgt aussehen:

...
...
DBServer=xx.xx.xx.xx
DBName=Testuser
...
...


Ich möchte jetzt den Wert einer spezifischen Zeile ausgeben. Muss ich denn bei der Suche die ganze Zeile schreiben oder ist es möglich z.B nur nach DBServer zu suchen, dann zu trennen und was nach dem "=" kommt zu speichern und ausgeben?
Bisher bin ich soweit gekommen
Code:
File Data = new File("C:/Dokumente und Einstellungen/Lempert/Desktop/Project/Winpeak.ini"); 
            b = new BufferedReader(new InputStreamReader(new FileInputStream(Data)));  
            line = new String(b.readLine());
            if (line.equals("DBServer"))
            {
                 tmp = line.split("=");
                 DBServer=tmp[1];
                 System.out.println(DBUser);
            }
	    else if {
	    ..

Aber irgendwie kriege ich nichts raus, woran liegt es?
 
Also so sollte es klappen?
Code:
File Data = new File("C:/Dokumente und Einstellungen/Lempert/Desktop/Project/Winpeak.ini"); 
            b = new BufferedReader(new InputStreamReader(new FileInputStream(Data)));  
            line = new String(b.readLine());
            if (line.startsWith("DBServer"))
            {
                 tmp = line.split("=");
                 DBServer=tmp[1];
                 System.out.println(DBUser);
            }
	    else if {
	    ..
 
warum lädst du die datei nicht einfach mit java.util.Properties und greifst mit getProperty("DBServer"); drauf zu ?
 
@All: Also wie ich es gemacht habe mit startsWith, das klappt immer noch nicht... hmmm...

@Roar: Wie meinst du das? Also wie kriege ich die Datei geladen und danach muss ich ja Keys festlegen also z.B DBServer oder? Und beim "=" muss getrennt werden...
 
Lass dir jeweils mal die Zeile die du behandelst nochmal ausgeben, sicherheitshalber.

Ansonsten ist die Schreibweise die du verwendest nicht so schön....les die datei ein (mit while und readLine()) und guck jeweils nach ob die Zeile damit anfängt...nebenbei nen Counter mitlaufen lassen.
 
Code:
Properties prop = new Properties();
prop.load("deine_datei.txt");

System.out.println(prop.getProperty("DBServer")); 
//Ausgabe: xx.xx.xx.xx

sollte selbsterklärend sein
 
Anm: Es gibt in der Datei auch leere Zeilen ;-)
Ich habe es mal so
Code:
Properties prop = new Properties(); 
            prop.load("C:/Dokumente und Einstellungen/Louis2/Desktop/Data.ini"); 

            System.out.println(prop.getProperty("DBServer")); 
            //Ausgabe: xx.xx.xx.xx

probiert, kommt die Meldung, "... load(java.io.InputStream) in java.util.Properties cannot be applied to (java.lang.String)"
Habe dann File x = new Files("..."); gemacht und prop.load(x), selbes Problem, halt mit File. Wo ist mein Fehler?


Habe dann auch
Code:
File Data = new File("C:/Dokumente und Einstellungen/Lempert/Desktop/Project/Data.ini"); 
            b = new BufferedReader(new InputStreamReader(new FileInputStream(Data)));  
            while ((line = b.readLine()) != "[SammelEmail]") 
            { 
                tmp = line.split(": ");  
                
                if (line.startsWith("USER"))
                    INIEmailFrom=tmp[1];
                    System.out.println(INIEmailFrom);
                counter++;
            } 
                b.close();


Meldung "java.lang.ExceptionInInitializerError
Caused by: java.lang.ArrayIndexOutOfBoundsException: 1"

Mir wäre die erste Variante lieber, da ich ja nur den Wert von bestimmte Zeilen brauchen und nicht alles durchqueren muss... aber wieso geht es nicht?
 
Code:
Properties prop = new Properties(); 
InputStream in = new FileInputStream("C:/Dokumente und Einstellungen/Louis2/Desktop/Data.ini");
prop.load(in); 

System.out.println(prop.getProperty("DBServer")); 
 //Ausgabe: xx.xx.xx.xx
 
Louis2 hat gesagt.:
Code:
Properties prop = new Properties(); 
            prop.load("C:/Dokumente und Einstellungen/Louis2/Desktop/Data.ini"); 

            System.out.println(prop.getProperty("DBServer")); 
            //Ausgabe: xx.xx.xx.xx

probiert, kommt die Meldung, "... load(java.io.InputStream) in java.util.Properties cannot be applied to (java.lang.String)"
Habe dann File x = new Files("..."); gemacht und prop.load(x), selbes Problem, halt mit File. Wo ist mein Fehler?
*heul* wieso schaut keiner meine Links an.....

ok - ich probiers nochmal http://java.sun.com/j2se/1.5.0/docs/api/java/util/Properties.html#load(java.io.InputStream)
 
deathbyaclown hat gesagt.:
Louis2 hat gesagt.:
Code:
Properties prop = new Properties(); 
            prop.load("C:/Dokumente und Einstellungen/Louis2/Desktop/Data.ini"); 

            System.out.println(prop.getProperty("DBServer")); 
            //Ausgabe: xx.xx.xx.xx

probiert, kommt die Meldung, "... load(java.io.InputStream) in java.util.Properties cannot be applied to (java.lang.String)"
Habe dann File x = new Files("..."); gemacht und prop.load(x), selbes Problem, halt mit File. Wo ist mein Fehler?
*heul* wieso schaut keiner meine Links an.....

ok - ich probiers nochmal http://java.sun.com/j2se/1.5.0/docs/api/java/util/Properties.html#load(java.io.InputStream)
Aha ok danke, ich habe es danach gemerkt :roll:

Zwar funktioniert der Code von KSG9|plak super, nur wenn ich in meine Datei eine Zeile
User name=xxx habe, und dann mit "System.out.println(prop.getProperty("User name"));" abfrage, kommt null raus, was nicht stimmt. Der hat wohl Probleme bei Leerzeichen oder? Wie kriege ich das anders hin als UserName zusammenzuschreiben?? ???:L
Ausserdem erscheinen die Werte bei System... immer doppelt ???:L
 
Louis2 hat gesagt.:
Aha ok danke, ich habe es danach gemerkt :roll:

Zwar funktioniert der Code von KSG9|plak super, nur wenn ich in meine Datei eine Zeile
User name=xxx habe, und dann mit "System.out.println(prop.getProperty("User name"));" abfrage, kommt null raus, was nicht stimmt. Der hat wohl Probleme bei Leerzeichen oder?
hihi - auszug aus dem Link
The key contains all of the characters in the line starting with the first non-white space character and up to, but not including, the first unescaped '=', ':', or white space character other than a line terminator
also ja - keine Leerzeichen.

Ich nehme als Konvention, dass Bezeichner per . getrennt werden, was auch die Übersicht fördert

also user.name = xxx
 
Also ich habe es anders gelöst:
Code:
public SammelMail() 
    {
        super("Java email client (Mail)");
        
        try 
        { 
            Properties prop = new Properties(); 
            InputStream in = new FileInputStream("C:/Dokumente und Einstellungen/Louis2/Desktop/Project/Data.ini"); 
            prop.load(in);  
            LogSchalter = prop.getProperty("USER");
            tmp = LogSchalter.split("=");
            LogSchalter1=tmp[1];
            System.out.println(LogSchalter1); 
        }
        catch (IOException e) 
        { 
            System.out.println("Error during data reading"); 
        }

Die Frage ist warum bei "System.out.println(LogSchalter1); " der Wert 2mal rauskommt
 
Code:
LogSchalter = prop.getProperty("USER");
            tmp = LogSchalter.split("=");
            LogSchalter1=tmp[1];
            System.out.println(LogSchalter1);
hä? wieso nochmal splitten....

Properties Dateien sind folgendermaßen aufgebaut

user.name = deathbyaclown

man lädt sie mit load ein und bekommt dann per getProperty("user.name") den String deathbyaclown.....
 
@deathbyaclown:

Weil ich meine Zeile als "User Name=xx" gelassen habe, d.h ich kriege Name=xx raus und splitte dann um xx rauszukriegen allein ;-)

1. eine Zeile lautet "SERVER NAME=xxxx.yyyy" und ich brauche xxxx und yyyy separat gespeichert (2 Strings).
So habe ich es gemacht
Code:
DBServerName =  prop.getProperty("SERVER");
tmp1 = DBServerName.split("=");
DBServerNametmp = tmp1[1];
tmp=DBServerNametmp.split(".");
DBName = tmp[0];
DBServer = tmp[1];
System.out.println(DBName + DBServer);

Aber beim compilieren wird gemeckert:
Code:
java.lang.ExceptionInInitializerError
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
 
sorry dann ist aber das ganze mit den Properties Unsinn - dann kannst es auch gleich selbst einlesen.

warum machst du nicht einfach user.name oder ähnliches, dann hast du das ganze problem überhaupt nicht und kannst einfach per getProperty auslesen ??
 
Weil die Datei als solche nicht geändert werden darf.
Und zwar werden die Daten aus der BDE geholt und dort steht nunmal "User Name" :-(

Also ich habe herausgefunden, dass man nicht nach einem "." splitten darf, hmmm und wir kriege ich nun die xxxx und yyyy von
"SERVER NAME=xxxx.yyyy" auseinander?

Und ausserdem erscheint bei Sopln immer der Wert 2mal, hmmm da ist doch nirgendwo ne For-Schleife ???:L

In File
Code:
.
.
.
z.B
DRIVERNAME=ORACLE
USER NAME=test
PASSWORD=77D3F18AA79D1D22
.
.
SERVER NAME=xxxx.yyyy

Code
Code:
try 
        { 
            Properties prop = new Properties(); 
            InputStream in = new FileInputStream("C:/Dokumente und Einstellungen/Lempert/Desktop/Project/Winpeak.ini"); 
            b = new BufferedReader(new InputStreamReader(in));  

            prop.load(in);  
            line = b.readLine(); 
            if (line.startsWith("[Database]"))
            {
            DBUser1 = prop.getProperty("USER");
            tmp = DBUser1.split("=");
            DBUser = tmp[1];
            }
            DBPassword =  prop.getProperty("PASSWORD");
            DBServerName =  prop.getProperty("SERVER");
            tmp1 = DBServerName.split("=");
            DBServerNametmp = tmp1[1];
            tmp=DBServerNametmp.split(":");
            DBName = tmp[0];
            DBServer = tmp[1];
            INIEmailFrom1 = prop.getProperty("Addresser");
            tmp = INIEmailFrom1.split("=");
            INIEmailFrom = tmp[1];
            INIEmailToBCC1 = prop.getProperty("BCC");
            tmp = INIEmailToBCC1.split("=");
            INIEmailToBCC = tmp[1];
            INIHost1 = prop.getProperty("SMTP");
            tmp = INIHost1.split("=");
            INIHost = tmp[1];
            DBPassword =  prop.getProperty("LogOnly");
                        
        }
        catch (IOException e) 
        { 
            System.out.println("Error during data reading"); 
        }

Und irgendwie erscheinen wenn ich Sopln die Werte immer doppelt z.B von PASSWORD, es gibt diese Wert in der Datei aber nur 1mal
 
wie gesagt, unter den vorraussetzungen halte ich die Properties Klasse für ungeeignet,.

Nimm lieber die Scanner Klasse:

Bsp:

Code:
Scanner s = new Scanner( new File( "test/test.properties" ) );
s.useDelimiter( "[=,\n]" );
while (s.hasNext()) {
   System.out.println( "key: " + s.next() );
   System.out.println( "value: " + s.next() );
}

Datei:
Code:
DRIVERNAME=ORACLE
USER NAME=test
PASSWORD=77D3F18AA79D1D22
SERVER NAME=xxxx.yyyy

Ausgabe:
key: DRIVERNAME
value: ORACLE

key: USER NAME
value: test

key: PASSWORD
value: 77D3F18AA79D1D22

key: SERVER NAME
value: xxxx.yyyy
 
Also ich habe es so gelassen und auch hingekriegt bei SERVER NAME=xxxx.yyyy das xxxx und yyyy in 2 Variablen zu speichern.

Paar Fragen hätte ich aber noch:
1. Wenn ich eine Variable mit S.o.pln ausgebe, dann wird der Wert 2mal angezeigt obwohl es ihn in der Datei nur 1mal gibt.
2. Wenn ich verschiedene Kapitel habe in der Datei und z.B 2mal den selben Name (oder fast) im Kapitel, dann muss ich nach Kapitel suchen und dann drin nach der Variable+Wert, wie geht das?
Beispiel:
Code:
[Database]
DRIVERNAME=ORACLE
USER NAME=test
PASSWORD=cccc

[BDE]
SERVER NAME=xxxx.yyyy
USER SERVER=demo
2 Kapitel, in jedem gibt es "USER...", jetzt will ich nach Kapitel suchen und dann drin, hatte an "while ((line=b.readline()) = "[Database]")..." oder so gedacht. Aber ich muss dann irgendwie nur in [Database] suchen...


Code:
public SammelMail() 
    {
        super("Java email client (Mail)");
        
        try 
        { 
            Properties prop = new Properties(); 
            InputStream in = new FileInputStream("C:/Dokumente und Einstellungen/Lempert/Desktop/Project/Winpeak.ini"); 
           
            prop.load(in);  
            DBUser1 = prop.getProperty("USER");
            tmp = DBUser1.split("=");
            DBUser = tmp[1];
            DBPassword =  prop.getProperty("PASSWORD");
            DBServerName =  prop.getProperty("SERVER");
            tmp1 = DBServerName.split("=");
            DBServerNametmp = tmp1[1];
            tmpDBName=DBServerNametmp.indexOf(".");
            DBName=DBServerNametmp.substring(0,tmpDBName);
            DBServer=DBServerNametmp.substring(tmpDBName+1);
            INIEmailFrom1 = prop.getProperty("Addresser");
            tmp = INIEmailFrom1.split("=");
            INIEmailFrom = tmp[1];
            INIEmailToBCC1 = prop.getProperty("BCC");
            tmp = INIEmailToBCC1.split("=");
            INIEmailToBCC = tmp[1];
            INIHost1 = prop.getProperty("SMTP");
            tmp = INIHost1.split("=");
            INIHost = tmp[1];
            DBPassword =  prop.getProperty("LogOnly");
                        
        }
        catch (IOException e) 
        { 
            System.out.println("Error during data reading"); 
        }
 
das mit dem doppelten ausgeben seh ich grad nicht warum, aber wenn du nun mit versch. Unterteilungen arbeitest wiederhol ich nochmal meinen Rat:

Geh weg von den Properties !!

Code:
[Database]
USER NAME=test

[BDE]
USER SERVER=demo

laedst du dieses File per Properties ein erhaelts du folgende Properties:
Code:
{[Database]=, USER=SERVER=demo , [BDE]=}
d.h. da der Key USER 2x vorhanden ist wird der erste Eintrag einfach ueberschrieben !

Also entweder:

1. ihr einigt euch dass derjenige, der die Datei schreibt anders schreibt (user.name bzw. user.server)
2. hoer auf mit Properties, nehm Scanner Klasse bzw. les es zeilenweise ein
 
deathbyaclown hat gesagt.:
das mit dem doppelten ausgeben seh ich grad nicht warum, aber wenn du nun mit versch. Unterteilungen arbeitest wiederhol ich nochmal meinen Rat:

Geh weg von den Properties !!

Code:
[Database]
USER NAME=test

[BDE]
USER SERVER=demo

laedst du dieses File per Properties ein erhaelts du folgende Properties:
Code:
{[Database]=, USER=SERVER=demo , [BDE]=}
d.h. da der Key USER 2x vorhanden ist wird der erste Eintrag einfach ueberschrieben !

Also entweder:

1. ihr einigt euch dass derjenige, der die Datei schreibt anders schreibt (user.name bzw. user.server)
2. hoer auf mit Properties, nehm Scanner Klasse bzw. les es zeilenweise ein

Benutze aber Java 1.4.02 und da gibt es java.util.Scanner nicht... also umsteigen :?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben