Синтаксический анализ текстового файла с использованием Java, предложения по использованию - PullRequest
1 голос
/ 18 января 2011

Я могу успешно читать текстовые файлы, используя классы InputFileStream и Scanner. Это очень легко, но мне нужно сделать что-то более сложное, чем это. Сначала немного о моем проекте. У меня есть устройство с датчиками, и я использую регистратор, который каждые 10 секунд записывает данные с датчиков в текстовый файл. Каждые 10 секунд это новая строка данных. Поэтому, когда я читаю файл, мне нужно собрать данные каждого отдельного датчика в массив. Например: скорость высота широта долгота

22 250 46.123245 122.539283

25 252 46.123422 122.534223

Так что мне нужно собрать данные о высоте (250, 252) в массив alt []; и так далее vel [], lat [], long [] ...

Тогда в последней строке текстового файла будет другая информация, только одна строка. В нем будет указана дата, пройденное расстояние, истекшее время ..

Так что после небольшого исследования я наткнулся на классы InputStream, Reader, StreamTokenizer и Scanner. Мой вопрос, какой из них вы бы порекомендовали для моего случая? Можно ли сделать то, что мне нужно сделать в моем случае? и сможет ли он проверить, какая последняя строка файла, чтобы он мог получить дату, расстояние и т. д. Спасибо!

Ответы [ 3 ]

1 голос
/ 18 января 2011

Reader + 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;
    }
}

Если вам нужны массивы, которых нет в списке:

velocity.toArray();

Насколько я понимаю, строки данных имеют 4 элемента, а последняя строка - 3(дата, расстояние, прошедшее время)

0 голосов
/ 18 января 2011

Поскольку ваши данные относительно просты, BufferedReader и StringTokenizer должны сделать свое дело. Вам придется читать вперед на одну строку, чтобы определить, когда больше не осталось строк.

Ваш код может выглядеть примерно так

      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

Но как вы обрабатываете саму линию, действительно зависит от вас, вы можете использовать Scanner, если вам удобнее с ней.

0 голосов
/ 18 января 2011

Я бы использовал сканер.Взгляните на примеры здесь .Другой вариант - использовать BufferedReader для чтения строки, а затем использовать метод синтаксического анализа для анализа этой строки в нужные токены.

Также может оказаться полезным этот поток .

Очень быстрая кодовая база по ссылке выше.В массиве input содержатся токены данных вашего файла.

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...