Как читать данные из текстового файла и сохранять некоторые данные из него в массив - PullRequest
1 голос
/ 16 января 2012

У меня есть текстовый файл на моем компьютере, который я читаю из моей Java-программы, я хочу построить некоторые критерии.Вот мой файл блокнота:

   #Students
   #studentId   studentkey  yearLevel   studentName token   
   358314           432731243   12          Adrian      Afg56       
   358297           432730131   12          Armstrong   YUY89       
   358341           432737489   12          Atkins      JK671   

        #Teachers
        #teacherId  teacherkey    yearLevel teacherName token   
        358314          432731243   12          Adrian      N7ACD       
        358297          432730131   12          Armstrong   EY2C        
        358341          432737489   12          Atkins      F4NGH

, когда я читаю из этого файла блокнота, я получаю точные данные в том виде, в котором они есть в моем приложении, но я хочу прочитать только столбец токенов внутри студентов и поместить их вмой массив с именем studentTokens.Вот код

public static void main(String[] args) {
    ArrayList<String > studentTokens = new ArrayList<String>();

    try{
        // Open the file that is the first 
        // command line parameter
        FileInputStream fstream = new  FileInputStream("c:/work/data1.txt");

        // Get the object of DataInputStream
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine;

        //Read File Line By Line
        while ((strLine = br.readLine()) != null)   {
            // Print the content on the console
            System.out.println (strLine);
        }

        //Close the input stream
        in.close();
    }catch (Exception e){//Catch exception if any
        System.err.println("Error: " + e.getMessage());
    }
}

Ответы [ 5 ]

4 голосов
/ 16 января 2012

Краткий совет:

private static Integer STUDENT_ID_COLUMN = 0;
private static Integer STUDENT_KEY_COLUMN = 1;
private static Integer YEAR_LEVEL_COLUMN = 2;
private static Integer STUDENT_NAME_COLUMN = 3;
private static Integer TOKEN_COLUMN = 4;

public static void main(String[] args) {

    ArrayList<String> studentTokens = new ArrayList<>();

    try (FileInputStream fstream = new FileInputStream("test.txt");
          InputStreamReader inputStreamReader = new InputStreamReader(fstream);
          BufferedReader br = new BufferedReader(inputStreamReader)) {

        String strLine;

        // Read File Line By Line
        while ((strLine = br.readLine()) != null) {

            strLine = strLine.trim();

            if ((strLine.length() != 0) && (strLine.charAt(0) != '#')) {
                String[] columns = strLine.split("\\s+");
                studentTokens.add(columns[TOKEN_COLUMN]);
            }

        }
    }
    catch (Exception e) {// Catch exception if any
        System.err.println("Error: " + e.getMessage());
        return;
    }

    for (String s : studentTokens) {
        System.out.println(s);
    }
}

Приведенный выше код не является полным решением.Извлекает все токены (для студентов и преподавателей).Я надеюсь, что вам удастся заставить его работать только для студенческих жетонов ...

1 голос
/ 16 января 2012

Вместо того, чтобы что-то делать в java.io, вы должны подумать о переходе на java.nio , теперь у него есть очень хороший API для работы.

Вот небольшой код, который даст вам желаемый результат.

import java.io.BufferedReader;

import java.nio.charset.Charset;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import java.util.ArrayList;
import java.util.List;

public class StudentToken
{
    public static void main(String[] args) throws Exception
    {       
        List<String> studenttoken = new ArrayList<String>();
        Path sourcePath = Paths.get(args[0]);
        Charset charset = Charset.forName("US-ASCII");
        BufferedReader reader = Files.newBufferedReader(sourcePath, charset);
        int width = 0;
        int height = 0;

        String line = null;     
        line = reader.readLine();
        while (!((line = reader.readLine()).trim()).equals("#Teachers"))
        {       
            line = line.trim();
            if (width == 0)
            {
                String[] str = line.split("\\s+");
                width = str.length;
            }           
            if (line.length() > 0)  
            height++;
        }
        reader.close();

        BufferedReader reader1 = Files.newBufferedReader(sourcePath, charset);
        reader1.readLine();
        for (int i = 0; i < height; i++)
        {
            if(!((line = reader1.readLine()).trim()).equals("#Teachers"))
            {
                line = line.trim();
                String[] str = line.split("\\s+");
                for (int j = 0; j < width; j++)
                {
                              // this condition will add only those elements which fall under token column.
                    if (j == (height) && i != 0) 
                        studenttoken.add(str[j]);                   
                }
            }
        }
        reader1.close();
        System.out.println(studenttoken);
    }
}

Вот результат теста:

enter image description here

Надеюсь, это может помочь. Привет.

0 голосов
/ 16 января 2012

Взгляните на метод String.split, который поможет вам разбить каждую строку на пробел.После того, как вы разбили его, вы можете получить значение столбца токена.Наконец, позвоните ArrayList.add, чтобы добавить его в свой список.

0 голосов
/ 16 января 2012

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

String splitString = strLine.split ("\ t");String tokenvalue = splitString [4];

Или сохранить как CSV-файл для удобства манипулирования

0 голосов
/ 16 января 2012

Вы можете читать файл построчно и использовать String.split ("\ s +").

...