在Java中读取文件并拆分数据

在Java中读取文件并拆分数据,java,data-structures,split,fileinputstream,Java,Data Structures,Split,Fileinputstream,我正在尝试从.txt文件读取数据。格式如下所示: ABC, John, 123 DEF, Mark, 456 GHI, Mary, 789 class structure { public String data1; public String data2; public String data3; } structure item = new structure();//create a new instance for each row in the tex

我正在尝试从.txt文件读取数据。格式如下所示:

 ABC, John, 123
 DEF, Mark, 456
 GHI, Mary, 789
class structure {
    public String data1;
    public String data2;
    public String data3;
}
structure item = new structure();//create a new instance for each row in the text file.
item.data1 = splitOut[0];
item.data2 = splitOut[1];
item.data3 = splitOut[2];
list.add(item);
我试图去掉逗号,将数据放入数组或结构(最有可能是结构)

这是我用来提取每个项目的代码:

package prerequisiteChecker;

import java.util.*;
import java.io.*;

public class TestUnit {

    public static void main(String[]args){      
        try {
            FileInputStream fstream = new FileInputStream("courses.txt");
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String strLine;

            while ((strLine = br.readLine()) != null) {
                String[] splitOut = strLine.split(", ");
                for (String token : splitOut)
                    System.out.println(token);
            }
            in.close();
        } catch (Exception e){
            System.err.println("Error: " + e.getMessage());
        }
    }

} 
有一次,我在“while”循环中有一个打印行,以查看这些项目是否会被拆分。他们是。现在我不知道下一步该怎么办。我试图将每个分组放在一个结构中。例如:ID-ABC。名字-约翰。123房间

我在家里有几本关于Java的书,并且试着在网上浏览。外面有这么多,但似乎没有一个能把我引向正确的方向

谢谢


Michael

创建一个类似以下内容的类:

 ABC, John, 123
 DEF, Mark, 456
 GHI, Mary, 789
class structure {
    public String data1;
    public String data2;
    public String data3;
}
structure item = new structure();//create a new instance for each row in the text file.
item.data1 = splitOut[0];
item.data2 = splitOut[1];
item.data3 = splitOut[2];
list.add(item);
这将形成您的基本数据结构,您可以使用它保存您在问题中提到的数据类型。现在,您可能希望遵循正确的面向对象方法,例如将所有字段声明为私有,并编写getter和setter。你可以在这里找到更多

现在,在while循环之外,创建一个如下的ArrayList:
ArrayList list=new ArrayList()这将用于保存要解析的所有不同数据行

现在,在while循环中执行以下操作:

 ABC, John, 123
 DEF, Mark, 456
 GHI, Mary, 789
class structure {
    public String data1;
    public String data2;
    public String data3;
}
structure item = new structure();//create a new instance for each row in the text file.
item.data1 = splitOut[0];
item.data2 = splitOut[1];
item.data3 = splitOut[2];
list.add(item);

这将基本上获取您在每一行中解析的数据,通过为解析的每一新行创建一个新实例,将其放入您声明的数据结构中。最后,使用
列表在ArrayList中插入该数据项。如上图所示,在代码中添加(项)

我会创建一个很好的结构来存储您的信息。我不确定您是否希望如何访问数据,但这里有一个很好的示例。我会放弃你之前说的。请注意,我只公开了变量,因为它们是最终的。一旦你走上这条路,它们就不会改变。如果希望课程是可变的,请创建getter和setter,并将实例变量更改为private。之后,您可以使用该列表检索您想要的任何课程

package prerequisiteChecker;

import java.util.*;
import java.io.*;

public class TestUnit {

    public static void main(String[] args) {
        try {
            FileInputStream fstream = new FileInputStream("courses.txt");
                    // use DataInputStream to read binary NOT text
            // DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
            String strLine;
            List<Course> courses = new LinkedList<Course>();
            while ((strLine = br.readLine()) != null) {
                String[] splitOut = strLine.split(", ");
                if (splitOut.length == 3) {
                    courses.add(new Course(splitOut[0], splitOut[1],
                            splitOut[2]));
                } else {
                    System.out.println("Invalid class: " + strLine);
                }
            }
            in.close();
        } catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
        }
    }

    public static class Course {
        public final String _id;
        public final String _name;
        public final String _room;

        public Course(String id, String name, String room) {
            _id = id;
            _name = name;
            _room = room;
        }

    }
} 
package-prerequisiteChecker;
导入java.util.*;
导入java.io.*;
公共类测试单元{
公共静态void main(字符串[]args){
试一试{
FileInputStream fstream=新的FileInputStream(“courses.txt”);
//使用DataInputStream读取二进制而不是文本
//DataInputStream in=新的DataInputStream(fstream);
BufferedReader br=新的BufferedReader(新的InputStreamReader(fstream));
弦斯特林;
列出课程=新建链接列表();
而((strLine=br.readLine())!=null){
String[]splitOut=strLine.split(“,”);
if(splitOut.length==3){
课程。添加(新课程(拆分[0],拆分[1],
拆分[2]);
}否则{
System.out.println(“无效类:+strLine”);
}
}
in.close();
}捕获(例外e){
System.err.println(“错误:+e.getMessage());
}
}
公共静态课堂{
公共最终字符串_id;
公共最终字符串\u名称;
公共最终字符串室;
公共课程(字符串id、字符串名称、字符串室){
_id=id;
_名称=名称;
_房间=房间;
}
}
} 
公共类文件\u读写器{
私有静态类结构{
公共字符串数据;
}
公共静态void main(字符串[]args)引发IOException{
字符串allDataString;
FileInputStream fileReader=新的FileInputStream(“read_data_file.txt”);
DataInputStream in=新的DataInputStream(文件读取器);
BufferedReader bufferReader=新的BufferedReader(新的InputStreamReader(in));
字符串[]arrayString={“ID-”,“NAME-”,“ROOM-”};
int recordNumber=0;
结构[]结构=新结构[10];
对于(int i=0;i<10;i++)
结构[i]=新结构();
而((allDataString=bufferReader.readLine())!=null){
String[]splitOut=allDataString.split(“,”);
结构[recordNumber]。数据=”;
对于(int i=0;i

我修改您给定的代码。它起作用了。尝试一下,如果有任何查询,请询问。

创建一个包含这三个属性的类名信息。在while循环中,创建NameInfo的新对象,分配属性,并将其添加到arraylistello。你的建议在某种程度上似乎有效(但这可能是由于我无法正确实施)。我按照建议添加了代码。但是,我似乎无法访问TRY循环之外的数据。我为我的格式和知识的缺乏道歉。当我试图从不同的来源学习时,似乎没有太多的东西是我喜欢的,我只是挑选我喜欢的。因此,正如我所建议的,您似乎正在while循环外部创建ArrayList,但仍在try块内部。这就是您无法在try块之外访问其中的数据的原因。如果在try块之外声明arraylist,则应该能够访问它。如果你想更详细地阅读它,这会对你有更大的帮助。。。