2013-05-14 2 views
0

Я пытался научить себя Java в течение нескольких месяцев. Я устал от книг, которые учат вас говорить «привет» и еще немного ИМО.Как выделить «токены» в отдельные переменные

Вот мой вопрос, я хочу прочитать текстовый файл с разделителями табуляции в определенные поля. Некоторые из полей - int, некоторые строки, а некоторые - массивы int []. (Мне трудно поверить, что это трудно прочитать простой файл!)

Как получить переменную токенов, где первый токен в записи (строке) является «int», второй - «String», 3 через 5 являются отдельными «int», а следующие 21 должны находиться в массиве «int» []?

Заранее благодарим за помощь.

package viewOfGolfSystem; 

import java.io.File; 
import java.io.FileReader; 
import java.util.Scanner; 

import javax.swing.JFileChooser; 
import javax.swing.filechooser.FileNameExtensionFilter; 

class TextDataCheck { 
    static public void main(String args[]) throws Exception { 

    JFileChooser chooser = new JFileChooser(); 
    FileNameExtensionFilter filter = new FileNameExtensionFilter(
       "TXT and CSV files", "txt", "csv"); 
    chooser.setFileFilter(filter); 
    int returnVal = chooser.showOpenDialog(chooser); 
    if (returnVal == JFileChooser.APPROVE_OPTION) { 
     chooser.addChoosableFileFilter(filter); 
     chooser.showOpenDialog(null); 
     File f = chooser.getSelectedFile(); 

     String filename = f.getAbsolutePath(); 
      // should return the filename(i.e.path) 

     FileReader flr = new FileReader(filename); 
     Scanner sInput = new Scanner(flr).useDelimiter("\t"); 

     while (sInput.hasNext()) { 
     System.out.println(sInput.next()); 
      } 
     sInput.close(); 

     } else { 
      System.out 
      .println("File chosen is not an approved option. Try again\n"); 
     } 
    } 
} 

ответ

0

В зависимости от маршрута вы хотите пойти, и гибкость вам нужно, чтобы вы могли написать код самостоятельно, а примеры такого кода можно найти на сотнях сайтов, например on this blog. Ядро кода, который они предлагают, это следующее:

BufferedReader bReader = new BufferedReader(
      new FileReader(dataFileName)); 

    String line; 

    /** 
    * Looping the read block until all lines in the file are read. 
    */ 
    while ((line = bReader.readLine()) != null) { 

     /** 
     * Splitting the content of tabbed separated line 
     */ 
     String datavalue[] = line.split("\t"); 
     String value1 = datavalue[0]; 
     String value2 = datavalue[1]; 
     int value3 = Integer.parseInt(datavalue[2]); 
     double value4 = Double.parseDouble(datavalue[3]); 

     /** 
     * Printing the value read from file to the console 
     */ 
     System.out.println(value1 + "\t" + value2 + "\t" + value3 + "\t" 
       + value4); 
    } 
    bReader.close(); 

Должно быть легко адаптировано к вашим целям.

Теперь совершенно другим маршрутом будет использование существующего парсера с плоским пространством общего назначения, такого как JSAPar. Красота этого решения заключается в том, что все преобразование управляется конфигурационным файлом, поэтому, если завтра вы захотите изменить формат файла, будет легче адаптировать вашу программу. Конечно, ничто не бесплатное, потребуется некоторое время, чтобы изучить такую ​​библиотеку, и добавляет дополнительный размер вашему решению.

0

Как о чем-то вроде:

private static class Thing { 

    private final int int1; 
    private final String string2; 
    private final int int3; 
    private final int int4; 
    private final int int5; 
    private final int[] int21; 

    public Thing(final String[] line) { 
     int1 = Integer.parseInt(line[0]); 
     string2 = line[1]; 
     int3 = Integer.parseInt(line[2]); 
     int4 = Integer.parseInt(line[3]); 
     int5 = Integer.parseInt(line[4]); 
     int21 = new int[21]; 
     for (int i = 0; i < 21; ++i) { 
      int21[i] = Integer.parseInt(line[i - 5]); 
     } 
    } 
} 

public static void main(String[] args) throws Exception { 
    final BufferedReader reader = new BufferedReader(new FileReader("myFile.txt")); 
    final List<Thing> myThings = new LinkedList<Thing>(); 
    try { 
     String line; 
     while ((line = reader.readLine()) != null) { 
      myThings.add(new Thing(line.split("\t"))); 
     } 
    } finally { 
     reader.close(); 
    } 
} 

Прочитайте строку за строкой, а затем разделить на \t.

Создайте класс, который принимает String[] и анализирует его на требуемые значения.

Очевидно, что это не учитывает разделители и escape-символы, для этого вам понадобится гораздо более сложный метод парсинга. Вероятно, было бы проще использовать существующую библиотеку, например OpenCSV.

Смежные вопросы