如何将“标记”分离为单个变量

时间:2013-05-14 00:24:19

标签: java token

我一直在努力自学Java几个月。我已经厌倦了那些教你如何说“你好”的书籍以及其他很少的IMO。

这是我的问题,我想在特定字段中读取“制表符分隔”文本文件。一些字段是int,一些字符串,一些是int []数组。 (我觉得很难相信这很难读出一个简单的文件!)

如何获取令牌变量,其中记录(行)中的第一个令牌是“int”,第二个是“String”,3到5是单独的“int”,接下来的21个是在“int”中“array []?

提前感谢您的帮助。

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");
        }
    }
}

2 个答案:

答案 0 :(得分: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。该解决方案的优点在于整个转换由配置文件驱动,因此如果明天您想要更改文件格式,则更容易调整您的程序。当然没有什么是免费的,学习这样一个库需要一些时间,它会为你的解决方案增加额外的大小。

答案 1 :(得分: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[]的类并将其解析为所需的值。

显然,这没有考虑分隔符和转义字符,为了做到这一点,你需要一个更复杂的解析方法。使用像OpenCSV这样的现有库可能会更容易。