2012-01-08 4 views
1

Est-ce que quelqu'un sait comment lire correctement à partir d'un fichier d'entrée qui ressemble à ceci:lire un fichier en Java

0.12,4.56 2,5 0,0.234

Je veux ot lire en 2 tableaux comme ceci:

a[0]=0.12 
a[1]=2 
a[2]=0; 

b[0]=4.56 
b[1]=5 
b[2]=0.234 

en java j'ai essayé d'utiliser le scanner et il fonctionne comme vient iput 0 4 5 3,45 6,7898 etc, mais je veux pour l'entrée en haut avec les virgules Merci

c'est le code que j'ai essayé:

import java.io.File; 

importation java.io.FileNotFoundException; import java.util.Scanner;

public class IFFTI { 
    public static int size=0; 
    public static double[] IFFTInputREAL= new double[100]; 
    public static double[] IFFTInputIMAG= new double[100]; 

    static int real=0; 
    static int k=0; 

    public static void printarrays(){ 
     for(int k=0;k<size;k++){ 
     System.out.print(IFFTInputREAL[k]); 
     System.out.print(","); 
     System.out.print(IFFTInputIMAG[k]); 
     System.out.print("\n"); 
     } 
    } 

    public static void readIFFT(String fileName){ 

     try { 
      Scanner IFFTI = new Scanner(new File(fileName));   
      while (IFFTI.hasNextDouble()) { 
       if(real%2==0){ 
        IFFTInputREAL[k] = IFFTI.nextDouble(); 
        real++; 
       } 
       else{ 
        IFFTInputIMAG[k] = IFFTI.nextDouble(); 
       real++; 
       k++;} 
      } 
      try{ 
      size=k; 
      }catch(NegativeArraySizeException e){} 
     } catch (FileNotFoundException e) { 
      System.out.println("Unable to read file"); 
     } 

    } 
} 
+2

Pouvez-vous inclure le code que vous avez essayé? –

+0

jetez un coup d'oeil ici http://docs.oracle.com/javase/tutorial/essential/io/file.html – RanRag

+0

Je pense que vous avez juste besoin d'ajouter **. UseDelimiter (Pattern.compile ("[,]")) ** à votre ** Scanner ** après l'avoir construit. Voir ci-dessous pour une réponse plus détaillée. –

Répondre

5

Je pense que cela va faire ce que vous voulez:

String source = "0.12,4.56 2,5 0,0.234"; 

List<Double> a = new ArrayList<Double>(); 
List<Double> b = new ArrayList<Double>(); 

Scanner parser = new Scanner(source).useDelimiter(Pattern.compile("[ ,]")); 
while (parser.hasNext()) { 
    List use = a.size() <= b.size() ? a : b; 
    use.add(parser.nextDouble()); 
} 

System.out.println("A: "+ a); 
System.out.println("B: "+ b); 

qui délivre pour moi:

A: [0.12, 2.0, 0.0] 
B: [4.56, 5.0, 0.234] 

Vous voulez évidemment d'utiliser un fichier comme la source. Vous pouvez utiliser a.toArray() si vous voulez l'obtenir en double [].

+0

+1 pour utiliser le délimiteur du scanner –

+0

Maintenant que le code original a été ajouté, je pense que c'est tout ce dont vous avez besoin. –

0

lecture d'un fichier en Java est facile:

http://www.exampledepot.com/taxonomy/term/164

Comprendre ce qu'il faut faire avec les valeurs une fois que vous les avez en mémoire est quelque chose que vous devez comprendre.

Vous pouvez le lire ligne par ligne et le transformer en valeurs séparées à l'aide de la fonction java.lang.Stringsplit(). Il suffit de donner ",|\\s+" comme séparateur et vous voilà parti:

public class SplitTest { 
    public static void main(String[] args) { 
     String raw = "0.12,4.56 2,5 0,0.234"; 
     String [] tokens = raw.split(",|\\s+"); 
     for (String token : tokens) { 
      System.out.println(token); 
     } 
    } 
} 
+0

Je sais que cela peut sembler stupide mais je ne sais pas comment utiliser le délimiteur de virgule. –

+0

btw Je fais des transformations de Fourier rapides et inverses. l'algorithme pour cela est fait .. tout ce dont j'ai besoin est l'entrée du fichier .. –

+0

J'ai couru et testé le code ci-dessus - il va casser des jetons soit par virgule ou par espace. Essayez-le. FFT n'est pas pertinent à votre question - vous voulez lire un fichier. Ce que vous faites avec les valeurs après les avoir n'affecte pas la lecture et la segmentation. – duffymo

0

Vous devrez lire la ligne complète.

String line = "0.12,4.56 2,5 0,0.234"; //line variable will recieve the line read 

Alors .. vous divisez la ligne sur les virgules ou les espaces

String[] values = line.split(" |,"); 

Cela se traduira par un tableau comme celui-ci: [0.12, 4.56, 2, 5, 0, 0.234]

Maintenant, réorganiser tout le contenu entre les deux tableaux de commande.

+0

Un scanner fonctionne si vous lui transmettez un motif regex compilé qui correspond à l'espace ou à la virgule. –

+0

Oui .. déjà corrigé. Merci –

1

EDIT Oups, ce n'est pas ce que vous voulez. Je ne vois pas la logique dans la façon de construire les tableaux que vous voulez.


  1. Lire le contenu du fichier
  2. diviser la chaîne sur les espaces. Créez pour chaque élément du tableau divisé un tableau.

    String input = "0.12,4.56 2,5 0,0.234"; 
    String parts[] = input.split(" "); 
    double[][] data = new double[parts.length][]; 
    
  3. Divisez chaque chaîne par des virgules.

  4. Analyser un double.

    for (int i = 0; i < parts.length; ++i) 
    { 
        String part = parts[i]; 
        String doubles[] = part.split(","); 
        data[i] = new double[doubles.length]; 
        for (int j = 0; j < doubles.length; ++j) 
        { 
         data[i][j] = Double.parseDouble(doubles[j]); 
        } 
    } 
    
0
 File file = new File("numbers.txt");   
     BufferedReader reader = null; 
     double[] a = new double[3]; 
     double[] b = new double[3]; 

     try { 
      reader = new BufferedReader(new FileReader(file)); 
      String text = null; 

      if ((text = reader.readLine()) != null) { 
       String [] nos = text.split("[ ,]"); 
       for(int i=0;i<nos.length/2;i++){ 
        a[i]=Double.valueOf(nos[2*i]).doubleValue(); 
        b[i]=Double.valueOf(nos[2*i+1]).doubleValue(); 
       } 
      } 

      for(int i=0;i<3;i++){ 
        System.out.println(a[i]); 
        System.out.println(b[i]); 
      } 

     } catch (FileNotFoundException e) {    
     } catch (IOException e) {    
     } finally { 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) {    
      } 
     }