在Java中读取文件并拆分数据
我正在尝试从.txt文件读取数据。格式如下所示:在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
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,则应该能够访问它。如果你想更详细地阅读它,这会对你有更大的帮助。。。