如何在Java或SQLite中按<ar>开头行分组插入SQLite行
我来帮你拆解这个需求,其实核心是先完成文本块的分组逻辑,再将分组后的内容写入SQLite数据库。下面分Java代码实现和SQLite操作两部分详细说明,你可以直接参考调整:
一、Java端文本分组与入库逻辑
首先我们需要把从SQLite读取的文档行数据,按照<ar>开头的规则分组,再批量插入到目标表中。以下是完整的代码示例:
import java.util.ArrayList; import java.util.List; public class ArContentProcessor { // 1. 从SQLite原表读取文档的所有行(按顺序) private static List<String> fetchOriginalLinesFromSQLite() { List<String> lines = new ArrayList<>(); String dbUrl = "jdbc:sqlite:your_document_db.db"; String querySql = "SELECT line_content FROM original_pages ORDER BY line_id"; // 假设original_pages是存储原文档页面的表,line_id是保证顺序的行号字段 try (var conn = java.sql.DriverManager.getConnection(dbUrl); var stmt = conn.createStatement(); var rs = stmt.executeQuery(querySql)) { while (rs.next()) { lines.add(rs.getString("line_content")); } } catch (java.sql.SQLException e) { e.printStackTrace(); } return lines; } // 2. 按规则分组:<ar>开头为首行,后续非<ar>行归为同一组 private static List<String> groupArContent(List<String> rawLines) { List<String> groupedContent = new ArrayList<>(); StringBuilder currentGroup = new StringBuilder(); for (String line : rawLines) { String trimmedLine = line.trim(); // 遇到<ar>开头的行,先处理上一个已收集的组 if (trimmedLine.startsWith("<ar>")) { if (currentGroup.length() > 0) { groupedContent.add(currentGroup.toString().trim()); currentGroup.setLength(0); // 清空当前组,准备新组 } currentGroup.append(line).append("\n"); // 启动新组 } else { // 非<ar>开头的行,追加到当前组(只有当前有正在收集的组时才处理) if (currentGroup.length() > 0) { currentGroup.append(line).append("\n"); } // 如果开头就是非<ar>行,这里默认忽略,你可以根据需求调整逻辑 } } // 处理最后一个未提交的组 if (currentGroup.length() > 0) { groupedContent.add(currentGroup.toString().trim()); } return groupedContent; } // 3. 将分组后的内容插入SQLite目标表 private static void insertGroupsToSQLite(List<String> groups) { String dbUrl = "jdbc:sqlite:your_document_db.db"; String insertSql = "INSERT INTO ar_grouped_content (content) VALUES (?)"; // 假设ar_grouped_content是存储分组后内容的表,content字段为TEXT类型 try (var conn = java.sql.DriverManager.getConnection(dbUrl); var pstmt = conn.prepareStatement(insertSql)) { // 批量插入提升效率 conn.setAutoCommit(false); for (String group : groups) { pstmt.setString(1, group); pstmt.addBatch(); } pstmt.executeBatch(); conn.commit(); } catch (java.sql.SQLException e) { e.printStackTrace(); } } // 主方法串联整个流程 public static void main(String[] args) { List<String> rawLines = fetchOriginalLinesFromSQLite(); List<String> groupedContent = groupArContent(rawLines); insertGroupsToSQLite(groupedContent); System.out.println("分组插入完成,共插入" + groupedContent.size() + "条记录"); } }
二、SQLite相关准备
表结构创建
如果你还没有目标表,可以用以下SQL创建:CREATE TABLE IF NOT EXISTS ar_grouped_content ( id INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT NOT NULL );原表(存储原始页面行)的结构建议包含行号字段,保证读取顺序正确:
CREATE TABLE IF NOT EXISTS original_pages ( line_id INTEGER PRIMARY KEY AUTOINCREMENT, line_content TEXT NOT NULL );Java依赖
操作SQLite需要引入sqlite-jdbc包,Maven项目可以在pom.xml中添加:<dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version>3.45.2.0</version> <!-- 使用最新稳定版本 --> </dependency>
三、特殊情况处理
- 连续
行 :代码会自动将前一个组存入,再启动新组,符合需求 - 空行:如果原文档有空行,你可以在
groupArContent方法中添加判断,跳过无意义的空行 - 开头非
行 :当前代码默认忽略,如果你需要保留这些内容,可以添加逻辑将其单独作为一组插入
内容的提问来源于stack exchange,提问作者ShahRukhMlk
相关产品推荐
相关产品推荐

