Zahlen in Unicode konvertieren

Status
Nicht offen für weitere Antworten.

Info_Guy

Mitglied
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:
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!
 
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 ?

es soll gerüchteweise auch Mädchen hier geben 😉
 
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.
 
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
 
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.
 
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
 
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.
 
Hi: ich glaube nicht das des so richtig sein kann - haber aber mal deinen Vroschlag verwendet.
Lediglich das System.out fehlt: Hier der Code

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.
 
noch wer ne Idee? oder tips zum obigen code?

Hier nun mein aktuelles Codegewurtschtel:

Code:
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;
	        }
	       }
 
Ich meinte das in etwa so (Achtung, nicht getestet):
Code:
	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.
 
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 🙂
 
also wie setzte ich das dann ein?

geht das dann so?

Code:
        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 ;
}
 
jetzt muss das ganze nur im Array abgelegt und ausgelesen werden - am besten mit

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

?
 
weiß auch nich warum ich dir die mit reinkopiert habe 🙂

Diese soll einfach an bestehenden Text in einer Datei - neuen dazu schreiben können 🙂
 
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:
Code:
theArrayList.add( new Integer( merker));

Am Ende kennst Du ja die Länge der Liste und kannst dann das Array konstruieren:
Code:
int[] ia = new int[theArrayList.size()];
for ( int i=0; ii<ia.length; i++) ia[i]=((Integer)(theArrayList.get( in))).intValue();
return ia;
 
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
 
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:
Code:
List theArrayList = new ArrayList();
 
Hi: er sagt mir cannont find symbol class List

Code:
 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;
}
}
 
Hi, er mekert immernoch beim BufferedReader
Code:
                BufferedReader rdr = new BufferedReader( new InputStreamReader( new FileInputStream(F)));

cannot find F

aber ich habs doch angegeben
 
Info_Guy hat gesagt.:
Hi, er mekert immernoch beim BufferedReader
Code:
                BufferedReader rdr = new BufferedReader( new InputStreamReader( new FileInputStream(F)));

cannot find F

aber ich habs doch angegeben
Außerhalb des Blocks sind deklarierte Variablen nicht sichtbar.
 
Code:
 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;
}
 
Problem: Du deklarierst "F" und verwendest später "f"; Java unterscheidet bei Bezeichnern aber zwischen Groß- und Kleinschreibung
 
So, ich habe jetzt folgenden Code fertig:
Code:
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:
Code:
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?
 
Code:
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));
   }
 
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
 
"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
 
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
 
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.
 
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:
Code:
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
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben