读取文本文件并在java中将数字存储在不同的数组中

时间:2013-09-19 12:02:52

标签: java bufferedreader filereader

我目前正在撰写论文,在这种情况下,我需要使用java开发元启发式。但是,在尝试读取和存储数据时,我遇到了问题。

我的文件是一个文本文件,大约有150行。问题的一个例子是在第5行,其中陈述了三个整数:30,38和1.我想将它们中的每一个存储为一个分别称为L,T和S的整数,这对于许多其他的整数来说都是如此。线。

你们谁知道怎么做?如果需要,我可以发送txt文件。

顺便说一句:这是我到目前为止所尝试过的:

Main.java:

import java.io.IOException;
import java.io.FileWriter;
import java.io.BufferedWriter;


public class MAIN {

public static void main(String[] args) throws IOException {
    Test.readDoc("TAP_T38L30C4F2S12_03.txt");
    }   
}

Test.java:

import java.io.*;
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Map;

public class Test {

private static ArrayList<Integer> integerList = new ArrayList<Integer>();
public static Map<String, ArrayList<Integer>> data = new HashMap<String,               ArrayList<Integer>>();
public static String aKey;

public static void readDoc(String File) {

try{
FileReader fr = new FileReader("TAP_T38L30C4F2S12_03.txt");
BufferedReader br = new BufferedReader(fr);

while(true) {
    String line = br.readLine();
    if (line == null) 
    break;
else if (line.matches("\\#\\s[a-zA-Z]")){
    String key = line.split("\\t")[1];
    line = br.readLine();
    data.put(key, computeLine(line));
    }
else if (line.matches("\\\\\\#\\s(\\|[a-zA-Z]\\|,?\\s?)+")){
     String[] keys = line.split("\\t");
     line = br.readLine();
     ArrayList<Integer> results = computeLine(line);
     for (int i=0; i<keys.length; i++){
          aKey = aKey.replace("|", "");
        //  data.put(aKey, results.get(i));
          data.put(aKey, results);
     }
    }
    System.out.println(data);

    }
} catch(Exception ex) {
    ex.printStackTrace();      }    
}


private static ArrayList<Integer> computeLine (String line){
    String[] splitted = line.split("\\t");
    for (String s : splitted) {
    integerList.add(Integer.parseInt(s));
    }

    return integerList;
}

}

这里可以看到数据的例子:

     \# TAP instance 
     \# Note that the sequence of the data is important!
     \#
     \# |L|, |T|, |S|
     30 38  1
     \#
     \# v
     8213   9319    10187   12144   8206    ...
     \#
     \# w
     7027   9652    9956    13973   6661    14751   ...
     \#
     \# b
     1  1   1   1   1   ...
     \#
     \# c
     1399   1563    1303    1303    2019    ...
     \#
     \# continues

2 个答案:

答案 0 :(得分:2)

以下代码正在处理您提供的示例数据。

简而言之

  1. 创建一个用于存储数据的字段,我选择了TreeMap,因此您可以将字母映射到一定数量的整数,但您可以使用另一个Collection

    < / LI>
  2. 使用BufferedReader#readLine()

  3. 逐行阅读文件
  4. 然后根据您的数据处理每一行。在这里,我使用regular expressions来匹配给定的行,然后删除不是数据的所有内容。请参阅String#split()String#matches()

  5. 在所有开始之前,先阅读一些关于java和面向对象设计的优秀初学者书籍。

    public class ReadAndParse {
    
        public Map<String, ArrayList<Integer>> data = new TreeMap<String, ArrayList<Integer>>();
    
         public ReadAndParse() {
            try {
                FileReader fr = new FileReader("test.txt");
                BufferedReader br = new BufferedReader(fr);
                while(true) {
                    String line = br.readLine();
                    if (line == null)    break;
    
                    else if (line.matches("\\\\#\\s[a-zA-Z]")){
                        String key = line.split("\\s")[1];
                        line = br.readLine();
    
                        ArrayList<Integer> value=  computeLine(line);
    
                        System.out.println("putting key : " + key + " value : " + value);
                        data.put(key, value);
                    }
                    else if (line.matches("\\\\\\#\\s(\\|[a-zA-Z]\\|,?\\s?)+")){
                        String[] keys = line.split("\\s");
                        line = br.readLine();
    
                        ArrayList<Integer> results = computeLine(line);
    
                        for (int i=1; i<keys.length; i++){
                            keys[i] = keys[i].replace("|", "");
                            keys[i] = keys[i].replace(",", "");
    
                            System.out.println("putting key : " + keys[i] + " value : " + results.get(i-1));
    
                            ArrayList<Integer> value=  new ArrayList<Integer>();
                            value.add(results.get(i-1));
                            data.put(keys[i],value);
                        }
                    }
                }
    
            } 
            catch (IOException e) {
                e.printStackTrace();
            }
    
            // print the data
            for (Entry<String, ArrayList<Integer>> entry : data.entrySet()){
                System.out.println("variable : " + entry.getKey()+" value : "+ entry.getValue() );
            }
    }
    
        // the compute line function
        private ArrayList<Integer> computeLine(String line){
            ArrayList<Integer> integerList = new ArrayList<>();
            String[] splitted = line.split("\\s+");
            for (String s : splitted) {
                System.out.println("Compute Line : "+s);
                integerList.add(Integer.parseInt(s));
            }
            return integerList;
        }
    
        // and the main function to call it all
    public static void main(String[] args) {
        new ReadAndParse();
    }
    }
    

    解析文件后得到的一些示例输出:

     variable : L value : [30]
     variable : S value : [1]
     variable : T value : [38]
     variable : b value : [1, 1, 1, 1, 1]
     variable : c value : [1399, 1563, 1303, 1303, 2019]
     variable : v value : [8213, 9319, 10187, 12144, 8206]
     variable : w value : [7027, 9652, 9956, 13973, 6661, 14751]
    

答案 1 :(得分:0)

我想我有所收获。

编辑:

我改变了方法

您需要导入;

import java.io.BufferedReader;

然后

BufferedReader reader = new BufferedReader

int[] arr = new int[3];
int L;
int T;
int S;
for (int i = 0 ;i<5; i++){ //brings you to fifth line

 line = reader.readLine();
}
L = line.split(" ")[0]trim();
T = line.split(" ")[1]trim();
S = line.split(" ")[2]trim();

arr[0] = (L);
arr[1] = (T);    
arr[2] = (S);