0

我制作了一个程序,我将从文本文件中读取数据并将它们存储在 mysql 的表中。在我的程序中,用户会给出文件所在的目录,然后程序将只找到 .txt 文件并继续。之后将创建一个表,它将有 2 个字段,在这些字段中我将插入文本文件中的值。

我的问题是我不知道怎么做!我会向你解释我的意思!在我的程序中,我将创建带有字段(ID、名称)的表。这些字段的值必须取自文本文件。所有文件如下:在此处输入图像描述

如您所见,ID 在文件的第三行,名称在第五行。谁能帮助我如何在表中导入 ID 和 Name 的值?如何每次从文件中只获取这些值?

执行第一步的代码是:

公共静态 void main(String args[]) 抛出异常 {

Class.forName("com.mysql.jdbc.Driver");
Connection con = (Connection) DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/mydb", "", "");

String dirpath = "";
Scanner scanner1 = new Scanner(System.in);
while (true) {
    System.out.println("Please give the directory:");
    dirpath = scanner1.nextLine();
    File fl = new File(dirpath);
    if (fl.canRead())

        break;
    System.out.println("Error:Directory does not exists");
}

try {
    String files;
    File folder = new File(dirpath);
    File[] listOfFiles = folder.listFiles();

    for (int i = 0; i < listOfFiles.length; i++) {
        if (listOfFiles[i].isFile()) {
            files = listOfFiles[i].getName();
            if (files.endsWith(".txt") || files.endsWith(".TXT")) {
                List<File> txtFiles = new ArrayList<File>();
                txtFiles.add(listOfFiles[i]);
                String[] parts = files.split("\\.");
                String tablename = parts[0];

                for (File txtFile : txtFiles) {
                    List sheetData = new ArrayList();

                    try {
                        FileReader in = new FileReader(txtFile);
                        BufferedReader br = new BufferedReader(in);
                        String line = br.readLine();
                        while (line != null) {
                            System.out.println(line);
                            line = br.readLine();

                        }
                        in.close();

                    } catch (Exception e) {
                        System.err.println("Error: " + e.getMessage());
                    }

                    getCreateTable1(con, tablename);
                    importData(con, txtFile, tablename);
                }
            }
        }
    }

} catch (Exception e) {
    System.out.println();
}

}

私有静态字符串getCreateTable1(连接con,字符串表名){

try {
    Class.forName("com.mysql.jdbc.Driver");
    Statement stmt = con.createStatement();
    String createtable = "CREATE TABLE "
            + tablename
            + " ( ID INT , name VARCHAR(255)";
    System.out.println("Create a new table in the database");
    stmt.executeUpdate(createtable);
} catch (Exception e) {
    System.out.println(((SQLException) e).getSQLState());
    System.out.println(e.getMessage());
    e.printStackTrace();
}

return null;

}

4

2 回答 2

0
BufferedReader br = new BufferedReader(new FileReader(new File("path/to/file")));

String currentLine = br.readLine();

Map<Integer, String> nameByID = new HashMap<Integer, String>(); 
while (currentLine != null) {

  String[] tokens = currentLine.split("\t");
  int id = Integer.parseInt(tokens[2]);
  String name = tokens[4];
  nameByID.put(id, name);
  currentLine = br.readLine();

}

br.close();

nameByID将有您需要的名称和 ID。

请注意,调用创建新BufferedReader的、调用 readLine() 和关闭BufferedReader. 我没有插入这个,因为我不记得它了,但是如果你使用 Netbeans 或 Eclipse 之类的东西,你的 IDE 应该提示你插入

于 2013-06-18T12:20:24.420 回答
0

你应该尽量不要重新发明轮子。

使用 aFileNameExtensionFilter过滤.txt文件,这个类来自 swing,但在普通 java 中使用很好。

检查每一行是否与正则表达式模式匹配,这样您就可以在验证它的同时消化该行。

创建一个Person包含此信息的对象并返回一个- 这样您CollectionPerson可以将文件读取行为封装在远离数据库访问层的地方。

把所有这些都放在一个class被调用的地方,比如说,FileReader你会得到类似下面的东西:

public class FileReader {

    private final Pattern linePattern = Pattern.compile("^(\\w++)\\s++(\\w++)\\s*+$");
    private final Pattern lineBreakPattern = Pattern.compile("\r?\n");
    private final FileFilter txtFilter = new FileNameExtensionFilter("*.txt", "txt");
    private final File txtFolder;

    public FileReader(File txtFolder) {
        this.txtFolder = txtFolder;
    }

    public List<Person> readFiles() {
        final List<Person> people = new LinkedList<>();
        for (final File txtFile : txtFolder.listFiles()) {
            if (txtFilter.accept(txtFile)) {
                people.add(readFile(txtFile));
            }
        }
        return people;
    }

    private Person readFile(File txtFile) {
        try (final Scanner scanner = new Scanner(txtFile)) {
            scanner.useDelimiter(lineBreakPattern);
            final Person person = new Person();
            while (scanner.hasNext()) {
                final String line = scanner.next();
                final Matcher matcher = linePattern.matcher(line);
                if (matcher.matches()) {
                    switch (matcher.group(1).toUpperCase()) {
                        case "ID":
                            person.setId(Integer.parseInt(matcher.group(2)));
                            break;
                        case "NAME":
                            person.setName(matcher.group(2));
                            break;
                        default:
                            throw new IOException("Illegal line '" + matcher.group() + "'.");
                    }
                }
            }
            return person;
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
    }

    public static final class Person {

        private int id;
        private String name;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

因此,您将FileReader使用包含文件的文件夹创建一个,然后调用readFiles,然后将返回的内容保存List<Person>在数据库中。

让我们来看看这堂课。

readFiles方法循环遍历目录中的所有文件并检查每个文件是否匹配txtFilter- 这会过滤掉任何非.txt文件。

readFiles方法还创建并返回一个List<Person,这是读取文件的结果。由方法List填充readFile(File txtFile)。该方法负责读取各个文件并将它们解析为Person.

该类Person是一个非常简单的数据传输对象,包含属性和访问器。没有逻辑。

readFile方法Scanner在 Java 7 try-with-resources 构造中创建一个。它将分隔符设置为与平台无关的换行符模式(\r?\n意味着它匹配\r\nor \n),然后遍历扫描仪输出。

每一行都用 处理linePattern,这可能需要一些解释:

^(\\w++)\\s++(\\w++)\\s*+$
  • ^是“开始锚点”,即线从这里开始
  • (\\w++)表示捕获任意数量的单词字符
  • \\s++表示跳过任意数量的空白字符
  • (\\w++)和上面一样
  • \\s*+表示跳过零个或多个空白字符
  • $是“结束锚点”,即行尾

所以,如果模式匹配,我们就有一个有效的行。此外,在验证我们抓取的字符“组”时,这些是我们的键和值。

接下来我们switch在第一组上使用 a,这是使用带有Strings 的 Java 7 开关。person我们根据键的值填充,int在需要的地方解析。

最后我们return是人口稠密的人。

class应该可以让您顺利实现目标 - 将Person对象 sql 插入数据库是微不足道的。

您可能希望在文件读取过程中添加更多验证,例如检查是否找到了 aNAMEID。我把它留作练习。

于 2013-06-18T12:13:08.297 回答