2011-01-17 1 views
1

Je peux lire avec succès le fichier texte en utilisant les classes InputFileStream et Scanner. C'est très facile mais je dois faire quelque chose de plus complexe que ça. Un petit contexte sur mon projet d'abord .. J'ai un appareil avec des capteurs, et j'utilise logger qui enregistrera toutes les données 10sec de capteurs dans un fichier texte. Toutes les 10 secondes, c'est une nouvelle ligne de données. Donc, ce que je veux, c'est quand je lis un fichier est de saisir chaque donnée de capteur séparé dans un tableau. Par exemple: vitesse altitude latitude longitudeAnalyse de fichiers texte en utilisant java, suggestions nécessaires sur lesquelles utiliser

22 250 46,123245 122,539283

25 252 46,123422 122,534223

Je dois saisir des données d'altitude (250, 252) dans un alt tableau []; et ainsi de suite vel [], lat [], long [] ...

Ensuite, la dernière ligne du fichier texte aura des informations différentes, juste une seule ligne. Il aura la date, la distance parcourue, timeElapsed ..

Donc après avoir fait un peu de recherche, je suis tombé sur InputStream, Reader, StreamTokenizer et Scanner classe. Ma question est celle que vous recommanderiez pour mon cas? Est-il possible de faire ce que je dois faire dans mon cas? et sera-t-il en mesure de vérifier quelle est la dernière ligne du fichier afin qu'il puisse saisir la date, la distance et etc .. Merci!

Répondre

0

J'utiliserais un scanner. Jetez un oeil aux exemples here. Une autre option pour vous d'utiliser BufferedReader pour lire une ligne, puis avoir une méthode d'analyse pour analyser cette ligne dans les jetons que vous voulez. Vous pouvez également trouver ce thread utile.

Base de code très rapide sur le lien ci-dessus. Le tableau d'entrées a vos jetons de données de fichier.

public static void main(String[] args) { 
    BufferedReader in=null; 
    List<Integer> velocityList = new ArrayList<Integer>(); 
    List<Integer> altitudeList = new ArrayList<Integer>(); 
    List<Double> latitudeList = new ArrayList<Double>(); 
    List<Double> longitudeList = new ArrayList<Double>(); 
    try { 
     File file = new File("D:\\test.txt"); 
     FileReader reader = new FileReader(file); 
     in = new BufferedReader(reader); 
     String string; 
     String [] inputs; 
     while ((string = in.readLine()) != null) { 
      inputs = string.split("\\s"); 
      //here is where we copy the data from the file to the data stucture 
      if(inputs!=null && inputs.length==4){ 
       velocityList.add(Integer.parseInt(inputs[0])); 
       altitudeList.add(Integer.parseInt(inputs[1])); 
       latitudeList.add(Double.parseDouble(inputs[2])); 
       longitudeList.add(Double.parseDouble(inputs[3])); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally{ 
     try { 
      if(in!=null){ 
       in.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    //here are the arrays you want!!! 
    Integer [] velocities = (Integer[]) velocityList.toArray(); 
    Integer [] altitiudes = (Integer[]) altitudeList.toArray(); 
    Double [] longitudes = (Double[]) longitudeList.toArray(); 
    Double [] latitudes = (Double[]) latitudeList.toArray(); 
} 
+0

merci .. mais comment pourrais-je appliquer à ce dont j'ai besoin? Dans le dernier exemple à partir du lien fourni, il cherche le type de données suivant (int, string) .. Que se passe-t-il si j'ai string, int, int, int, float, float .. – t0x13

+0

La classe Scanner est très utile si vous avez affaire à différents types de données. Dans votre cas, les données sont-elles toujours numériques? – CoolBeans

+0

les données seront soit int ou float .. Je n'ai pas inclus toutes mes données mais je vais aussi avoir le temps et le temps écoulé à la fois je veux être 'String' – t0x13

0

Comme vos données est relativement simple, et BufferedReaderStringTokenizer devrait faire l'affaire. Vous devrez lire en avant d'une ligne pour détecter quand il n'y a plus de lignes à gauche.

Votre code pourrait être quelque chose comme ça

 BufferedReader reader = new BufferedReader(new FileReader("your text file")); 

     String line = null; 
     String previousLine = null; 

     while ((line = reader.readLine()) != null) { 
      if (previousLine != null) { 
      //tokenize and store elements of previousLine 
      } 
      previousLine = line; 
     } 
     // last line read will be in previousLine at this point so you can process it separately 

Mais la façon dont vous traitez la ligne elle-même est vraiment à vous, vous pouvez utiliser Scanner si vous vous sentez plus à l'aise avec elle.

+0

Vous pouvez utiliser String.split() au lieu de 'StringTokenizer', comme' String [] fields = previousLine.split ("") ' – Damien

+0

StringTokenizer .. convertira-t-il tous les éléments en String? J'ai besoin d'un tableau de int, et float .. – t0x13

1

Lecteur + String.split()

String line; 
String[] values; 
BufferedReader reader = new BufferedReader(new FileReader(args[0])); 
List<Integer> velocity = new ArrayList<Integer>(); 
List<Integer> altitude = new ArrayList<Integer>(); 
List<Float> latitude = new ArrayList<Float>(); 
List<Float> longitude = new ArrayList<Float>(); 

while (null != (line = reader.readLine())) { 
    values = line.split(" "); 
    if (4 == values.length) { 
     velocity.add(Integer.parseInt(values[0])); 
     altitude.add(Integer.parseInt(values[1])); 
     latitude.add(Float.parseFloat(values[2])); 
     longitude.add(Float.parseFloat(values[3])); 
    } else { 
     break; 
    } 
} 

Si vous avez besoin des tableaux pas la liste:

velocity.toArray(); 

En ce que j'undestand lignes de données a 4 points et la dernière ligne a 3 éléments (date, distance, temps écoulé)

+0

En fait arraylists sont plus applicables à ce dont j'ai besoin. Merci je vais essayer ça, ressemble exactement à ce dont j'ai besoin .. – t0x13

Questions connexes