如何用Java垂直解析TXT文件并将地址数据存入数据库?
嘿,我来帮你搞定这个需求!要实现解析指定文本文件并把Shipto、Soldto、From对应的地址存入数据库,咱们可以分三个核心步骤来做,下面是详细的实现思路和代码示例:
1. 读取文本文件内容
首先得把文件里的内容读进Java程序里,Java 11+提供了很简洁的Files类可以直接读取,当然也可以用传统的BufferedReader兼容更低版本,这里给你两种方式的示例:
import java.nio.file.Files; import java.nio.file.Paths; import java.io.IOException; public class FileParser { public static String readFile(String filePath) throws IOException { // Java 11+ 简洁写法 return Files.readString(Paths.get(filePath)); // 传统BufferedReader写法(兼容更低版本) /* StringBuilder content = new StringBuilder(); try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { String line; while ((line = br.readLine()) != null) { content.append(line).append(" "); } } return content.toString().trim(); */ } }
2. 解析文本提取目标数据
你的文本格式是关键字(Shipto/Soldto/From)加对应内容,后面跟着PO相关的内容,咱们可以用正则表达式来精准提取,非贪婪匹配能避免把后续的关键字内容也包含进来。
这里的正则模式可以写成:Shipto: (.*?) Soldto: (.*?) From: (.*?) PO,每个括号里的.*?就是我们要捕获的地址内容。
代码示例:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class DataExtractor { public static void extractAddresses(String fileContent) { // 定义正则模式 String pattern = "Shipto: (.*?) Soldto: (.*?) From: (.*?) PO"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(fileContent); if (m.find()) { String shipTo = m.group(1).trim(); String soldTo = m.group(2).trim(); String fromAddr = m.group(3).trim(); // 这里可以把这三个值传给数据库插入方法 insertIntoDatabase(shipTo, soldTo, fromAddr); } else { System.out.println("未匹配到目标数据格式"); } } }
3. 将数据存入数据库
这里咱们先用最基础的JDBC来实现,如果你用ORM框架(比如MyBatis、Spring JPA)会更简洁,但JDBC能让你清楚底层逻辑。
首先得先创建对应的数据库表,比如:
CREATE TABLE shipping_info ( id INT AUTO_INCREMENT PRIMARY KEY, shipto VARCHAR(255) NOT NULL, soldto VARCHAR(255) NOT NULL, from_addr VARCHAR(255) NOT NULL );
然后JDBC插入数据的代码:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class DatabaseHandler { // 数据库连接参数,根据你的实际配置修改 private static final String DB_URL = "jdbc:mysql://localhost:3306/your_database"; private static final String DB_USER = "your_username"; private static final String DB_PASSWORD = "your_password"; public static void insertIntoDatabase(String shipTo, String soldTo, String fromAddr) { String sql = "INSERT INTO shipping_info (shipto, soldto, from_addr) VALUES (?, ?, ?)"; try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, shipTo); pstmt.setString(2, soldTo); pstmt.setString(3, fromAddr); int affectedRows = pstmt.executeUpdate(); if (affectedRows > 0) { System.out.println("数据插入成功!"); } } catch (SQLException e) { e.printStackTrace(); // 这里可以根据业务需求做异常处理,比如日志记录、重试等 } } }
整合起来运行
最后把这几个部分整合到主方法里:
public class Main { public static void main(String[] args) { try { String filePath = "path/to/your/text/file.txt"; String fileContent = FileParser.readFile(filePath); DataExtractor.extractAddresses(fileContent); } catch (IOException e) { e.printStackTrace(); } } }
注意哦:
- 要确保你的项目里引入了对应数据库的驱动包,比如MySQL的mysql-connector-java
- 如果文本格式有变化,比如关键字后面的分隔符不同,要调整正则表达式来适配
- 实际项目里建议用连接池(比如HikariCP)来管理数据库连接,不要每次都创建新连接
内容的提问来源于stack exchange,提问作者DJ4186
相关产品推荐
相关产品推荐

