从.txt中提取 SQL

Extracting SQL from a .txt

提问人:MPCatcher 提问时间:11/5/2023 最后编辑:SelVaziMPCatcher 更新时间:11/6/2023 访问量:69

问:

我正在尝试从文本文件中提取值。文件内容如下:

客户

1, 'Aarón', 'Rivero', 'Gómez', 'Almería', 100
2, 'Adela', 'Salas', 'Díaz', 'Granada', 200
3, 'Adolfo', 'Rubio', 'Flores', 'Sevilla', NULL
4, 'Adrián', 'Suárez', NULL, 'Jaén', 300
5, 'Marcos', 'Loyola', 'Méndez', 'Almería', 200
6, 'María', 'Santana', 'Moreno', 'Cádiz', 100
7, 'Pilar', 'Ruiz', NULL, 'Sevilla', 300
8, 'Pepe', 'Ruiz', 'Santana', 'Huelva', 200
9, 'Guillermo', 'López', 'Gómez', 'Granada', 225
10, 'Daniel', 'Santana', 'Loyola', 'Sevilla', 125

我已经设法读取了文件并获取了行,但我无法指定以数字开头的确切行。我想拆分这些值并将它们添加到 SQL 表中。使用似乎不起作用,我没有想法。我尝试使用 a 来匹配该行,但它也不起作用。line.startsWith("^[0-9].*")matcher

Java MySQL 缓冲读卡器

评论

3赞 PeterMmm 11/5/2023
发布您目前拥有的代码。
1赞 rzwitserloot 11/5/2023
“我试过了(好主意),但它不起作用”不是一个合适的 SO 问题。添加您尝试过的代码;这个想法很好,如果它对你不起作用,你就有错误。我们可以提供帮助,但前提是您添加该代码,以便我们可以指出您在哪里编写了错误。
0赞 Roman C 11/5/2023
不起作用没有澄清。
3赞 g00se 11/6/2023
您有一个 csv 文件。大多数 RDBMS 允许从该格式直接导入
0赞 prasad_ 11/6/2023
“使用 line.startsWith(”^[0-9].*“) 似乎不起作用,...” - try ,其中是文本文件中每行的字符串数据。String 类的方法将正则表达式字符串作为参数。line.matches(^[0-9].*)linematches

答:

1赞 Oğuz Yeşil 11/5/2023 #1

这段代码对我有用

public class Main {


public static String[][] arrayedDatas(String data){
    String[] datas = data.split(",");
    
    int sizeOfData = datas.length/5;
    
    String[][] arrayed = new String[sizeOfData][5];
    
    int j = 0;
    for(int i=0; i<arrayed.length; i++) {
        arrayed[i][0] = datas[j].trim();
        arrayed[i][1] = datas[j+1].trim();
        arrayed[i][2] = datas[j+2].trim();
        arrayed[i][3] = datas[j+3].trim();
        arrayed[i][4] = datas[j+4].trim();
        j += 5;
    }
    
    return arrayed;
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    
    String datas = "1, 'Aarón', 'Rivero', 'Gómez', 'Almería', 100 2, 'Adela', 'Salas', 'Díaz', 'Granada', 200 3, 'Adolfo', 'Rubio', 'Flores', 'Sevilla', NULL 4, 'Adrián', 'Suárez', NULL, 'Jaén', 300 5, 'Marcos', 'Loyola', 'Méndez', 'Almería', 200 6, 'María', 'Santana', 'Moreno', 'Cádiz', 100 7, 'Pilar', 'Ruiz', NULL, 'Sevilla', 300 8, 'Pepe', 'Ruiz', 'Santana', 'Huelva', 200 9, 'Guillermo', 'López', 'Gómez', 'Granada', 225 10, 'Daniel', 'Santana', 'Loyola', 'Sevilla'";
    
    String[][] arrayed = arrayedDatas(datas);
    
    for(String[] a : arrayed) {
        for(String b : a) {
            System.out.println(b);
        }
        System.out.println("===========");
    }
    
 }

}

enter image description here

0赞 MPCatcher 11/5/2023 #2
public static void main(String[] args) throws IOException {
    try {
        String line;
        String currentSection = null;

        BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\nombr\\Downloads\\datos_ventas.txt"));

        while ((line = reader.readLine()) != null) {
            System.out.println(line);
            if (line.startsWith("Cliente")) {
                
                currentSection = "Clientes";
                
                if (line.startsWith("^[0-9].*")){
                    
                    String[] valores = line.split(",");
                    if (valores != null){
                        String valor1 = valores[0];
                        String valor2 = valores[1];
                        String valor3 = valores[2];
                        String valor4 = valores[3];
                        String valor5 = valores[4];
                        String valor6 = valores[5];
                        System.out.print("Id : " + valor1);
                        System.out.println("Nombre : " + valor2);
                        System.out.println("Apellidos : " + valor3 + " " + valor4);
                        System.out.println("Vivienda : " + valor5);
                        System.out.println("Precio : " + valor6);
                        
                        
                    }
                }
            }
        }
2赞 Akina 11/6/2023 #3

使用下一个查询将文件加载到(临时)表中:

load data infile 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/csv_data.csv' -- data file
into table test                                       -- destination table
character set utf8mb4                                 -- CSV file charset
fields terminated by ',' optionally enclosed by ''''  -- columns data parsing parameters
lines terminated by '\r\n'                            -- lines terminator
(id, name1, name2, name2, city, @data)                -- columns and variables list where the data will be loaded into
set data = nullif(@data, ' NULL');                    -- additional processing loaded data

来自 CLI 的副本:

mysql> create table test (id int, name1 text, name2 text, name3 text, city text, data int);
Query OK, 0 rows affected (0.39 sec)

mysql> load data infile 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/csv_data.csv' into table test character set utf8mb4 fields terminated by ',' optionally enclosed by '''' lines terminated by '\r\n' (id, name1, name2, name2, city, @data) set data = nullif(@data, ' NULL');
Query OK, 10 rows affected (0.07 sec)
Records: 10  Deleted: 0  Skipped: 0  Warnings: 0

mysql> SELECT * FROM test;
+------+--------------+------------+-------+-------------+------+
| id   | name1        | name2      | name3 | city        | data |
+------+--------------+------------+-------+-------------+------+
|    1 |  'Aarón'     |  'Gómez'   | NULL  |  'Almería'  |  100 |
|    2 |  'Adela'     |  'Díaz'    | NULL  |  'Granada'  |  200 |
|    3 |  'Adolfo'    |  'Flores'  | NULL  |  'Sevilla'  | NULL |
|    4 |  'Adrián'    |  NULL      | NULL  |  'Jaén'     |  300 |
|    5 |  'Marcos'    |  'Méndez'  | NULL  |  'Almería'  |  200 |
|    6 |  'María'     |  'Moreno'  | NULL  |  'Cádiz'    |  100 |
|    7 |  'Pilar'     |  NULL      | NULL  |  'Sevilla'  |  300 |
|    8 |  'Pepe'      |  'Santana' | NULL  |  'Huelva'   |  200 |
|    9 |  'Guillermo' |  'Gómez'   | NULL  |  'Granada'  |  225 |
|   10 |  'Daniel'    |  'Loyola'  | NULL  |  'Sevilla'  |  125 |
+------+--------------+------------+-------+-------------+------+

然后,您可以根据需要处理加载的数据。

0赞 g00se 11/6/2023 #4

您可以将其用作插入的强类型的基础,而不是将所有内容都视为 .您可以轻松地更改以读取文件而不是嵌入式输入:StringScanner

import java.util.Scanner;

public class SqlInserter {
    final static String DATA = """
        1, 'Aarón', 'Rivero', 'Gómez', 'Almería', 100
        2, 'Adela', 'Salas', 'Díaz', 'Granada', 200
        3, 'Adolfo', 'Rubio', 'Flores', 'Sevilla', NULL
        4, 'Adrián', 'Suárez', NULL, 'Jaén', 300
        5, 'Marcos', 'Loyola', 'Méndez', 'Almería', 200
        6, 'María', 'Santana', 'Moreno', 'Cádiz', 100
        7, 'Pilar', 'Ruiz', NULL, 'Sevilla', 300
        8, 'Pepe', 'Ruiz', 'Santana', 'Huelva', 200
        9, 'Guillermo', 'López', 'Gómez', 'Granada', 225
        10, 'Daniel', 'Santana', 'Loyola', 'Sevilla', 125
        """;

    record Person (Integer id, String name1, String name2, String name3, String city, Integer something) {
        public Person(String[] atoms) {
            this("NULL".equals(atoms[0])? null : Integer.valueOf(atoms[0]),
            atoms[1],
            atoms[2],
            atoms[3],
            atoms[4],
            "NULL".equals(atoms[5])? null : Integer.valueOf(atoms[5]));
        }
    }

    public static void main(String[] args) throws Exception {
        try (Scanner s = new Scanner(DATA).useDelimiter("\\R")) {
            s.tokens()
                .map(line -> line.replaceAll("'", ""))
                .map(line ->line.split("\\s*,\\s*"))
                .map(a -> new Person(a))
                .forEach(System.out::println);
        }
    }
}