Java:解析文本文件的任何想法?

时间:2014-01-31 09:53:08

标签: java

我是Java语言的新手。虽然我已经学习了很多关于String类和fIle I / O的东西,但我很难有效地操作字符串。在编写了一些代码之后,我发现String类中的split方法不是灵丹妙药。我想解析像

这样的文本文件
1   (201, <202,203>), (203, <204,208>), (204, <>)
2   (201, <202,203>), (204, <>)
3   (201, <202,203>), (203, <204,208>)
4   (201, <202,203>), (202, <>), (208, <>)
5   (202, <>), (208, <>)
6   (202, <>)

第一列是此文本文件中的字符,而不是行号。 在读完它的第一行之后,我希望顺序接收1,201,202,203,203,204,208和204,作为int值。什么字符串方法使用它是个好主意?提前谢谢。


代码(您可能不需要。)

import java.io.*;

public class IF_Parser
{       
    private FileInputStream fstream;
    private DataInputStream in;
    private BufferedReader br;

    public IF_Parser(String filename) throws IOException
    {
        try
        {
            fstream = new FileInputStream(filename);
            // Get the object of DataInputStream
            in = new DataInputStream(fstream);
            br = new BufferedReader(new InputStreamReader(in));
        }
        catch (Exception e)
        {
            System.err.println("Error: " + e.getMessage());
        }
    }

    public void Parse_given_file() throws IOException
    {
        try
        {
            String      strLine;
            int         line        = 1;
            while ((strLine = br.readLine()) != null)   
            {
                System.out.println("Line " + line);
                int i;
                String[] splits     =   strLine.split("\t");
                // splits[0] : int value, splits[1] : string representation of list of postings.
                String[] postings   =   splits[1].split(" ");

                line++;
            }
        }
        catch (Exception e)
        {
            System.err.println("Error: " + e.getMessage());
        }
    }
}

3 个答案:

答案 0 :(得分:3)

由于您要提取每行的数字值,我建议您查看Pattern类。一段简单的代码,如下所示:

   String str = "1   (201, <202,203>), (203, <204,208>), (204, <>)";
   Pattern p = Pattern.compile("(\\d+)");
   Matcher m = p.matcher(str);
   while(m.find())
   {
       System.out.println(m.group(1));
   }

将生成行中的所有数值:

1
201
202
203
203
204
208
204

本质上,该模式将寻找一个或多个重复的数字。当它找到它们时,它会将它们放在后来访问的组中。

答案 1 :(得分:1)

您也可以使用StringTokenizer类。代码简单如下:

import java.util.StringTokenizer;

公共类App {     public static void main(String [] args){

    String str = "1   (201, <202,203>), (203, <204,208>), (204, <>)";
    StringTokenizer st = new StringTokenizer( str, " ,()<>" );


    while ( st.hasMoreElements() ) {
        System.out.println( st.nextElement() );
    }

}

}

输出打印:

1 201 202 203 203 204 208 204

答案 2 :(得分:0)

1   (201, <202,203>), (203, <204,208>), (204, <>)

删除所有()<>。然后使用split()获取单个令牌,最后将其解析为integers

示例

String input = scanner.readLine(); // your input.

input = input.replaceAll("\\(\\)", "");
input = input.replaceAll("<>", "");

String[] tokens = input.split(",");

int[] values = new int[tokens.length];

for(int x = 0; x < tokens.length; x++)
{
    values[x] = Integer.parseInt(tokens[x]);
}