如何解析文本文件并从中创建数据库记录

时间:2013-05-21 19:45:31

标签: java sql arrays parsing readline

我正在尝试基本上制作一个简单的测试生成器。我想要一个按钮来解析文本文件并将记录添加到我的数据库中。问题和答案都在文本文件中。我一直在网上寻找例子,但我找不到符合我情况的。

文本文件包含我想要忽略的标题信息,直到以“~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);
        }
    });
}

1 个答案:

答案 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.
    }