# Zahlen in Unicode konvertieren



## Info_Guy (16. Mai 2006)

Hallo Jungs,

bisher habe ich hier immer schnelle Hilfe bekommen und hoffe auf dies auch diesesmal.

Ich will folgendes machen:

1676
-8555
3565
1478
-8977
1234

Diese Zahlen sollen also durch einen Zeilenumbruch  voneinander getrennt sein. Man kann diesem Zeilenumbruch an der Unicode-Zeichen-Kombination 13 und 10 erkennen. Das Minuszeichen '-' besitzt den Unicode 45. Die Ziffern 0 bis 9 werden durch die Zahlen 48 bis 57 codiert.

Methode soll Dateinamen als String bekommen und einen Array von int-Zahlen zurückgibt, das die Zahlen aus der Datei beinhaltet.

So mein bisheriger Code:

```
public char [] lies_Zahlen_aus(String Dateiname)
	   { File Datei;
	     BufferedReader Leser;
	     Datei = new File(Dateiname);
	     
	     try
	     { 
	        Leser = new BufferedReader(new FileReader(Datei));
	       int Zahllaenge = (int)Datei.length();
	       char [] Daten = new char [Zahllaenge];
	       Leser.read(Daten,0,Zahllaenge);
	       Leser.close();
	       for(int i=0;i<Zahllaenge;i++)
	        { System.out.print(Daten[i]);}
	        return Daten;
	      }
         catch(IOException e)
	      
	        { 
	            System.out.println("Ein Fehler ist aufgetreten!");
	            return null;
	        }
        }
```

Aber leider ist das ja eher nicht so richtig... ist speicher ja nix als UNI-code- irgendwie muss man es doch schaffen, die Ziffern usw.. in Unicode umzuwandeln... Brauche da mal Hilfe.


Ich danke euch!


----------



## bygones (16. Mai 2006)

1. Wähle bitte einen entsprechenden Titel - sowas nichts sagendes wird hier gar nicht gern gesehen.
2. schreib was nicht geht.

einfache regeln des postens


zum problem:
seh ich das richtig, dass du eine datei, in der Zahlen stehen, auslesen willst und die zahlen als array zurückgeben willst ? 
warum nicht einfach zeilenweise mit z.b. bufferedReader auslesen und einfach in ein int parsen ?



> Hallo Jungs,


es soll gerüchteweise auch Mädchen hier geben


----------



## Info_Guy (16. Mai 2006)

mache ich doch, ich kann zwar zeilenweise auslesen, muss aber unicode verwenden indem in jede stelle konvertiere in Unicode. 

Ich lese ja schon Zeilenweise aus, hätte ich auch Linenumber nehmen können - muss aber als UniCode abgespeichert werden und Array muss ausgelesen werden.


----------



## Murray (16. Mai 2006)

Wenn Deine Methode ein int-Array zurückliefern soll, warum deklarierst Du sie dann mit dem Rückgabetyp char[]?

Auf irgendwelche Unicode- oder ASCII-Codierungen musst Du m.E. für dieses Problem überhaupt nicht zurückgreifen.

Verwende BufferedReader#readLine, um die Datei zeilenweise einzulesen (Tip: wenn die Methode null zurückliefert, ist die Datei zuende).
Die gelesenen Strings kannst Du dann mit Integer#parseInt in ints umwandeln.

//EDIT: wieder zu spät


----------



## Murray (16. Mai 2006)

Info_Guy hat gesagt.:
			
		

> Ich lese ja schon Zeilenweise aus


Sehe ich im Code nicht  ???:L


----------



## Info_Guy (16. Mai 2006)

Hallo, danke für eure Tips - doch muss ich mit Unicode arbeiten. Es bleibt mir also nicht anderes übrigt. Sollte ich am besten versuchen beim auslesen ne If anweisung einzubauen?

Komme da echt nicht weiter

------------------------
das char ist noch von der Methode die ich getestet hatte mit Buchstaben.


----------------
edit: Der Bufferedreader liest mir doch das ganze aus. Ich könnte ja auch nen line reader benutzten - aber das ist ja nicht Sinn und Zweck.


----------



## Murray (16. Mai 2006)

Wenn Du unbedingt zeichenweise lesen willst / sollst, dann nimm BufferedReader#read. Die Zeichen musst dann mit einer Fallunterscheidung (if/else) behandeln. Mal als Pseudocode:

setze merker auf 0
lies zeichen z aus Datei, bis z <0 -> dann ist die Datei zuende
wenn (z = 45) und (merker = 0) merker = -1
sonst wenn z >= 48 und z <= 57 {
   wenn merker <0 merker = 10*merker - (z-48)
   sonst merker = 10*merker + (z-57)
}
sonst wenn z = 10 {
 merker in ergebnisliste speichern
 merker = 0;
}
sonst zeichen ignorieren


----------



## Info_Guy (16. Mai 2006)

Hi, danke für deinen Pseudocode. Ich werde mich gleich dran setzten und veruschen das zu coden. Werde mich bestimmt heute nochmals zu Wort melden müssen 

Dank dir.


----------



## Murray (16. Mai 2006)

Oops. hatte wohl einen Denkfehler: negative Zahlen werden so um den Faktor 10 zu groß


----------



## Info_Guy (16. Mai 2006)

Hi: ich glaube nicht das des so richtig sein kann - haber aber mal deinen Vroschlag verwendet. 
Lediglich das System.out fehlt: Hier der Code


```
public void lese_Uni_code(String Dateiname)
             {  File Datei;
                FileReader Leser;
                 Datei = new File(Dateiname);
               try{ 
              Leser = new FileReader(Datei);
              int Dateilaenge= (int)Datei.length();
              int  [] Daten = new char[Dateilaenge];
              Leser.read(Daten,0,Dateilaenge);
              Leser.close();
              int merker = 0;
              int [] Daten = lese_aus_Datei(Dateiname);
                for(int i=0;i<Dateilaenge;i++)
                 { if ( i == 45 && merker==0)
                   {merker = -1;}
                    else
                      { if (i >= 48 && i <=57)
                         { if (merker <0)
                             { merker = 10*merker - (i-48);}
                            else
                               { merker = 10*merker + (z-57);}
                              { if (i=10)
                                    { for (int i=0;i<=10;i++)
                                       { Daten[i]= Daten + Daten.merker(i);}
                                    }
                                }
                            }
                        }
                    }
                }
            }
```

------------------------------

alles was vor dem merker kommt, das kann ja weg. Ich muss nurnoch den Reader einbauen, da ja die auslese methode auf char [] basiert.


----------



## Info_Guy (16. Mai 2006)

noch wer ne Idee? oder tips zum obigen code?

Hier nun mein aktuelles Codegewurtschtel:


```
public int[] lese_Uni_code(String Dateiname)
             {  File Datei;
                FileReader Leser;
                Datei = new File(Dateiname);
               try{
              Leser = new FileReader(Datei);
              int Dateilaenge= (int)Datei.length();
              int  [] Daten = new int[Dateilaenge];
              
              Leser.close();
              int merker = 0;
              
                for(int i=0;i<Dateilaenge;i++)
                 { char [] Daten1 = lese_aus_Datei(Dateiname);
                     if ( i == 45 && merker==0)
                   {merker = -1;}
                    else
                      { if (i >= 48 && i <=57)
                         { if (merker <0)
                             { merker = 10*merker - (i-48);}
                            else
                               { merker = 10*merker + (i-57);}
                               if (i=10)
                                    { for (int i=0;i<=10;i++)
                                       { Daten[i]= Daten + Daten.merker(i);}}
                                    }
                                }
                            }
                        }
                    
                
                catch(IOException e)
	      
	        { 
	            System.out.println("Ein Fehler ist aufgetreten!");
	            return null;
	        }
	       }
```


----------



## Murray (16. Mai 2006)

Ich meinte das in etwa so (Achtung, nicht getestet):

```
BufferedReader rdr = new BufferedReader( new InputStreamReader( new FileInputStream( f)));
	int merker = 0;
	boolean neg = false;
	int z;
	while ( (z = rdr.read()) > -1) {
			  
		if ( (z == 45) && (merker==0)) {
			neg = true;
		} else if ((z >= 48) && (z <=57)) {
			merker = 10*merker + (z-48);
		} else if ( z == 10) {
			;
		} else if ( z == 13) {
			System.out.println( "Zahl gefunden:" +  merker);
			merker = 0;
			neg = false;
		} else {
			System.out.println( "syntax-error: z=" + z);
		}
	}
```

Gegenüber dem Pseudocode habe ich die Behandlung der negatven Zahlen etwas geändert.


----------



## Info_Guy (16. Mai 2006)

mhh - also das sieht gut aus, nur kenne in den Input nicht, was macht das f, noch garnicht deklariert oder?

Aber sieht schonma ähnlich meiner Version


----------



## Murray (16. Mai 2006)

Ist doch nur ein Fragment - aber stimmt; dass f eine File-Variable ist, sollte man dazu sagen.


----------



## Info_Guy (16. Mai 2006)

also wie setzte ich das dann ein?

geht das dann so?


```
public void hänge_ran(String Dateiname, String Text)
         { String noldText="";
           
              char [] Daten = lese_aus_Datei(Dateiname);
           
              for(int i=0;i<Daten.length; i++)
               if (i<Daten.length) 
                     {noldText = noldText + Daten[i];}
                       else noldText= noldText + Text.charAt(i-Daten.length);
                    }
                    
               public int[] lese_Uni_code(String Dateiname)
             { File F;
                 FileReader Leser;
                 F = new File(Dateiname);
                 BufferedReader rdr = new BufferedReader( new InputStreamReader( new FileInputStream(F)));
                int merker = 0;
                boolean neg = false;
                 int z;
                while ( (z = rdr.read()) > -1) 
                {
          
                 if ( (z == 45) && (merker==0)) 
                 {
                neg = true;
      }       
       else if ((z >= 48) && (z <=57)) 
       {
         merker = 10*merker + (z-48);
      } 
      else if ( z == 10)
      {
         ;
      } 
      else if ( z == 13) 
      {
         System.out.println( "Zahl gefunden:" +  merker);
         merker = 0;
         neg = false;
      } 
      else {
         System.out.println( "syntax-error: z=" + z);
      }
   }
   return merker ;
}
```


----------



## Murray (16. Mai 2006)

Wozu soll denn die Methode hänge_ran dienen?


----------



## Info_Guy (16. Mai 2006)

jetzt muss das ganze nur im Array abgelegt und ausgelesen werden  - am besten mit

int [] Unicode= new Unicode[merke.length]
for( int i....) 

?


----------



## Info_Guy (16. Mai 2006)

weiß auch nich warum ich dir die mit reinkopiert habe  

Diese soll einfach an bestehenden Text in einer Datei - neuen dazu schreiben können


----------



## Murray (16. Mai 2006)

Eine Möglichkeit: verwende beim Einlesen eine Collection, z.B. eine ArrayList. Dann fügst Du jede gefundene Zahl (verpackt in einen Integer-Wrapper) in die Liste eine:

```
theArrayList.add( new Integer( merker));
```

Am Ende kennst Du ja die Länge der Liste und kannst dann das Array konstruieren:

```
int[] ia = new int[theArrayList.size()];
for ( int i=0; ii<ia.length; i++) ia[i]=((Integer)(theArrayList.get( in))).intValue();
return ia;
```


----------



## Info_Guy (16. Mai 2006)

mhh... puh, weiß nichts mit dem add anzufangen, das ende ist mir klar - aber wo soll ich das 
 theArrayList.add( new Integer( merker));

reinpacken?

------------
edit: aber schonma vielen Dank für deine Bemühungen, ist echt super von Dir


----------



## Murray (16. Mai 2006)

Im Code gibt es ja eine Stelle, wo nach einem Zeilenumbruch der bis dahin aufgelaufene Wert ausgegeben und dann für die nächste Zeile wieder auf 0 gestzt wird. Da kann man das Ergebins dann "abgreifen" und in die Liste schreiben.

Und: die ArrayList deklarierst Du am besten als lokale Variable gelich am Anfang der Methode:

```
List theArrayList = new ArrayList();
```


----------



## Info_Guy (16. Mai 2006)

Hi: er sagt mir cannont find symbol class List


```
List theArrayList = new ArrayList();
                 File F;
                 FileReader Leser;
                 F = new File(Dateiname);
                 BufferedReader rdr = new BufferedReader( new InputStreamReader( new FileInputStream(F)));
                int merker = 0;
                
                boolean neg = false;
                 int z;
                while ( (z = rdr.read()) > -1)
                {
         
                 if ( (z == 45) && (merker==0))
                 {
                neg = true;
      }       
       else if ((z >= 48) && (z <=57))
       {
         merker = 10*merker + (z-48);
      }
      else if ( z == 10)
      {
         ;
      }
      else if ( z == 13)
      {
         System.out.println( "Zahl gefunden:" +  merker);
         merker = 0;
         neg = false;
         theArrayList.add( new Integer( merker));
      }
      else {
         System.out.println( "syntax-error: z=" + z);
      }
   }

 
   int[] ia = new int[theArrayList.size()];
   for ( int i=0; ii<ia.length; i++) ia[i]=((Integer)(theArrayList.get( in))).intValue();
   return ia;
}
}
```


----------



## Murray (16. Mai 2006)

```
import java.util.List;
import java.util.ArrayList;
```


----------



## Info_Guy (16. Mai 2006)

Hi, er mekert immernoch beim BufferedReader

```
BufferedReader rdr = new BufferedReader( new InputStreamReader( new FileInputStream(F)));
```

cannot find F

aber ich habs doch angegeben


----------



## André Uhres (17. Mai 2006)

Info_Guy hat gesagt.:
			
		

> Hi, er mekert immernoch beim BufferedReader
> 
> ```
> BufferedReader rdr = new BufferedReader( new InputStreamReader( new FileInputStream(F)));
> ...


Außerhalb des Blocks sind deklarierte Variablen nicht sichtbar.


----------



## Murray (17. Mai 2006)

Poste Doch mal bitte die ganze Methode, nicht nur das Fragment.


----------



## Info_Guy (17. Mai 2006)

Hi, ich habe oben doch die Ganze Methode gepostet.

@ Andre - wie, bzw. wo deklariere ich das dann? 

Danke


----------



## Murray (17. Mai 2006)

Info_Guy hat gesagt.:
			
		

> Hi, ich habe oben doch die Ganze Methode gepostet.


Nein.


----------



## Info_Guy (17. Mai 2006)

```
public int[] lese_Uni_code(String Dateiname)
             {   
                 List theArrayList = new ArrayList();
                 File F;
                 FileReader Leser;
                 F = new File(Dateiname);
                BufferedReader rdr = new BufferedReader( new InputStreamReader( new FileInputStream(f)));
                int merker = 0;
                
                boolean neg = false;
                 int z;
                while ( (z = rdr.read()) > -1)
                {
         
                 if ( (z == 45) && (merker==0))
                 {
                neg = true;
      }       
       else if ((z >= 48) && (z <=57))
       {
         merker = 10*merker + (z-48);
      }
      else if ( z == 10)
      {
         ;
      }
      else if ( z == 13)
      {
         System.out.println( "Zahl gefunden:" +  merker);
         merker = 0;
         neg = false;
         theArrayList.add( new Integer( merker));
      }
      else {
         System.out.println( "syntax-error: z=" + z);
      }
   }

 
   int[] ia = new int[theArrayList.size()];
   for ( int i=0; i<ia.length; i++) ia[i]=((Integer)(theArrayList.get(i))).intValue();
   return ia;
}
```


----------



## Murray (17. Mai 2006)

Problem: Du deklarierst "F" und verwendest später "f"; Java unterscheidet bei Bezeichnern aber zwischen Groß- und Kleinschreibung


----------



## Info_Guy (17. Mai 2006)

So, ich habe jetzt folgenden Code fertig:

```
public int[] lese_Uni_code(String Dateiname)
             {  try{ 
                 List theArrayList = new ArrayList();
                 File F;
                 FileReader Leser;
                 F = new File(Dateiname);
                BufferedReader rdr = new BufferedReader( new InputStreamReader( new FileInputStream(F)));
                int merker = 0;
                
                boolean neg = false;
                 int z;
                while ( (z = rdr.read()) > -1)
                {
         
                 if ( (z == 45) && (merker==0))
                 {
                neg = true;
      }       
       else if ((z >= 48) && (z <=57))
       {
         merker = 10*merker + (z-48);
      }
      else if ( z == 10)
      {
         ;
      }
      else if ( z == (13))
      {
         System.out.println( "Zahl gefunden:" +  merker);
         merker = 0;
         neg = false;
         theArrayList.add( new Integer( merker));
      }
      else {
         System.out.println( "syntax-error: z=" + z);
      }
    }
       int[] ia = new int[theArrayList.size()];
   for ( int i=0; i<ia.length; i++) ia[i]=((Integer)(theArrayList.get(i))).intValue();
   return ia;
}
   

 catch ( Exception e) {
  e.printStackTrace();
}
return null;
}
```

Leider ließt er mir die lezte Zeile nicht aus. Es liegt wohl hier dran: 

```
else if ( z == (13))
      {
         System.out.println( "Zahl gefunden:" +  merker);
         merker = 0;
         neg = false;
         theArrayList.add( new Integer( merker));
      }
      else {
         System.out.println( "syntax-error: z=" + z);
      }
```

Ich habe versucht dort eine negativierung in der If bedingung einzubiden. Klappt aber nicht so wirklich.
Was kann ich tun?


----------



## Murray (17. Mai 2006)

```
int merker = 0;
   boolean neg = false;
   boolean pending = false;
   int z;
   while ( (z = rdr.read()) > -1) {
          
      if ( (z == 45) && (merker==0)) {
         neg = true;
         pending = true;
      } else if ((z >= 48) && (z <=57)) {
         merker = 10*merker + (z-48);
         pending = true;
      } else if ( z == 10) {
         ;
      } else if ( z == 13) {
        if ( neg) merker = merker * -1;
         theArrayList.add( new Integer( merker));
         System.out.println( "Zahl gefunden:" +  merker);
         merker = 0;
         neg = false;
         pending = false;
      } else {
         System.out.println( "syntax-error: z=" + z);
      }
   } 
   if ( pending) {
         if ( neg) merker = merker * -1;
         theArrayList.add( new Integer( merker));
   }
```


----------



## Info_Guy (17. Mai 2006)

Hi, danke für die schnelle Reaktion. Ich lag wohl falsch mit meiner Vermutung.
Was ist denn die Funktion "Pending"? 

Danke erstmal. Ich schließe jetzt das Thema


----------



## Murray (17. Mai 2006)

"pending" ist keine Funktion, sondern eine in diese Methode deklarierte Variable. Sie wird immer dann auf true gesetzt, wenn eine Ziffer oder ein Minus gefunden wird. Wenn eine ganze Zahl erkannt und in die Ergebnisliste geschrieben wurde, wird das Flag wieder auf false gesetzt. So kann man am Ende der Schleife erkenne, ob es noch eine Zahl gibt, die noch nicht in die Ergebnisliste übernommen wurde.

//EDIT: Typos


----------



## Info_Guy (17. Mai 2006)

Hi,

also mit deinem Vorschlag scheint es doch nicht zu gehen. Er gibt mir Syntax-Error: also z=32 

Er ließt immer noch nicht die letzte Zeile aus. 

hmm

ps.: Die Datei, welche ausgelesen wird beinhaltet folgendes:

4668
5789
-1235


----------



## Murray (17. Mai 2006)

32 ist doch ein Leerzeichen, oder?? Das hat in der Datei nichts zu suchen.


----------



## Info_Guy (17. Mai 2006)

Wie konnte ich nur einen solchen Fehler begehen 

Also im Array werden jetzt alle Zeilen eingetragen, doch gibt er dann beim System.out nur 2 Zeilen an.


----------



## Murray (17. Mai 2006)

Bei der Behandlung er letzen Zahl hatte ich mir die Ausschreibung gespart, das kann man aber natürlich auch ändern. Und auch mit Leerzeich kann man klarkommen:

```
int merker = 0;
   boolean neg = false;
   boolean pending = false;
   int z;
   while ( (z = rdr.read()) > -1) {
         
      if ( (z == 45) && (merker==0)) {
         neg = true;
         pending = true;
      } else if ((z >= 48) && (z <=57)) {
         merker = 10*merker + (z-48);
         pending = true;
      } else if ( z == 10) {
         ;
      } else if ( z == 32) {
         ;
      } else if ( z == 13) {
        if ( pending) {      
          if ( neg) merker = merker * -1;
           theArrayList.add( new Integer( merker));
           System.out.println( "Zahl gefunden:" +  merker);
           merker = 0;
           neg = false;
           pending = false;
          }
      } else {
         System.out.println( "syntax-error: z=" + z);
      }
   }
   if ( pending) {
         if ( neg) merker = merker * -1;
         theArrayList.add( new Integer( merker));
         System.out.println( "Zahl gefunden:" +  merker);
   }
```

//EDIT: code-tags korrigiert


----------

