我正在尝试基本上制作一个简单的测试生成器。我想要一个按钮来解析文本文件并将记录添加到我的数据库中。问题和答案都在文本文件中。我一直在网上寻找例子,但我找不到符合我情况的。
文本文件包含我想要忽略的标题信息,直到以“~Sound of Syllabus”开头的行。我想要“〜教学大纲结束”来表明问题的开始。之后的几行查找一行“(”在第七个字符位置。我希望它表示问题编号行。问题编号行是唯一的,因为“(”在第七个字符位置。我想用它作为标记新问题开头的指标。在问题编号行中,前三个字符“T1A”是问题组.T1A * 01 *是该组内的问题编号。
所以,正如你所看到的,我还需要获得实际的问题文本行和答案行。通常在四个答案行之后是由“~~”表示的问题终结符。我不知道如何为文本文件中的所有问题执行此操作。我是否继续将它们添加到数组String?如何从文件中访问此信息并将其添加到数据库中。这对我来说非常混乱,我觉得我可以通过看一个涵盖我情况的例子来了解它是如何工作的。这是我正在谈论的文本文件的链接:http://pastebin.com/3U3uwLHN
代码:
public static void main(String args[]) {
String endOfSyllabus = "~ End of Syllabus";
Path objPath = Paths.get("2014HamTechnician.txt");
String[] restOfTextFile = null;
if (Files.exists(objPath)){
File objFile = objPath.toFile();
try(BufferedReader in = new BufferedReader(
new FileReader(objFile))){
String line = in.readLine();
List<String> linesFile = new LinkedList<>();
while(line != null){
linesFile.add(line);
line = in.readLine();
}
System.out.println(linesFile);
}
catch(IOException e){
System.out.println(e);
}
}
else{
System.out.println(
objPath.toAbsolutePath() + " doesn't exist");
}
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new A19015_Form().setVisible(true);
}
});
}
答案 0 :(得分:1)
使用Java阅读文本文件很简单(并且肯定会有其他更有创意/更有效的方法):
try (BufferedReader reader = new BufferedReader(new FileReader(path))) { //try with resources needs JDK 7
int lineNum = 0;
String readLine;
while ((readLine = reader.readLine()) != null) { //read until end of stream
可以像这样完成跳过任意数量的行:
if (lineNum == 0) {
lineNum++;
continue;
}
你真正的问题是要拆分的文字。如果您使用CSV,则可以使用String[] nextLine = readLine.split("\t");
根据制表符分隔将每一行拆分为各自的单元格。但是你没有,所以你会被困在阅读每一行,而不是找到分开的东西。
您似乎可以控制文本文件格式。如果是,请转到更易于使用的格式,例如CSV,否则您将为您的格式设计自定义解析器。
使用CSV的一个好处是可以非常有效地镜像数据库。即您的CSV标题列=数据库列。
就数据库而言,使用JDBC很容易,只需确保使用预准备语句插入数据以防止SQL注入:
public Connection connectToDatabase(){
String url = "jdbc:postgresql://url";
return DriverManager.getConnection(url);
}
Connection conn = connectToDatabase();
PreparedStatement pstInsert = conn.prepareStatement(cInsert);
pstInsert.setTimestamp(1, fromTS1);
pstInsert.setString(2, nextLine[1]);
pstInsert.execute();
pstInsert.close();
conn.close();
- 编辑 -
我之前没有看到你的pastebin。您似乎并不负责文件格式,因此您需要拆分空格(每个单词)并依赖正则表达式来确定这是否是一个问题。幸运的是,文件似乎相当一致,所以你应该能够做到这一点而不会有太多问题。
- 编辑2--
作为一种可能的解决方案,您可以尝试这种未经测试的代码:
try{
BufferedReader reader = new BufferedReader(new FileReader("file.txt")); //try with resources needs JDK 7
boolean doRegex = false;
String readLine;
while ((readLine = reader.readLine()) != null) { //read until end of stream
if(readLine.startsWith("~~ End of Syllabus")){
doRegex = true;
continue; //immediately goto the next iteration
}
if(doRegex){
String[] line = readLine.split(" "); //split on spaces
if(line[0].matches("your regex here")){
//answer should be line[1]
//do logic with your answer here
}
}
}
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}