如何使用Nodejs读取文本文件并将数据插入PostgreSQL?

ttcibm8c  于 2023-01-08  发布在  Node.js
关注(0)|答案(2)|浏览(142)

我有一个txt文件中的数据,像这样:-

A1085|CR01B|      |13261F001000|0000000728|      |0000000000000|      |99000|01|

这个文本文件包含超过500 k行,我想用nodejs读取并插入到PostgreSQL表中。这些空格也应该像这个空格一样读取和保存。
我写了这样的脚本,它是工作的,数据也被插入到表中,但它是非常多的时间,如10分钟的2万行只。

const readTextFile = async () => {
    const File = await fs.readFileSync('data.txt', 'utf-8');
    let arr = File.split("|");
    let modified = [];
    let temp = [];
    for (let i = 0; i < arr.length; i++) {
        if (i % 10 === 0) {
            modified.push([...temp]);
            temp = [];
            temp.push(arr[i].replace('\x00\r\n', ''));
        } else {
            temp.push(arr[i]);
        }
    }
    console.log("modified", modified.length);
    for (let i = 0; i < modified.length; i++) {
        await insertValuesToDB(modified[i]);
    }
}

const insertValuesToDB = async (values) => {
    try {
        const text = `INSERT INTO requirement(container, module, mod_devdate, part_no, qty, tapdate, tap_qty, taptime, sup_cd, namc_id) VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)`;
        const result = await client.query(text, values);
        console.log("result", result);
    } catch (e) {
        console.log("ERROR", e);
    }
}
4ktjp1zp

4ktjp1zp1#

如果可能的话,我认为简单的\copy是最快的解决方案。例如:
How to import CSV file data into a PostgreSQL table
也许这是不可能的,因为必须进行数据清理。
另一种可能性是在事务中 Package 插入操作。也许这可以"批处理",以降低内存消耗。
最小示例:

await client.query('BEGIN')
for (let i = 0; i < modified.length; i++) {
  await insertValuesToDB(modified[i]);
}
await client.query('COMMIT')

参见:https://node-postgres.com/features/transactions

uurv41yg

uurv41yg2#

for (let i = 0; i < modified.length; i++) {
    await insertValuesToDB(modified[i]);
}

我认为不建议在这个函数中向数据库插入数据时循环这个过程,我建议在一个查询中完成所有操作,当我在mysql中遇到这种问题时,我是这样解决的:

INSERT INTO EXAMPLE (
name,
surname,
email)
VALUES
(
    '1name',
    '1surname',
    '1email'
),
(
    '2name',
    '2surname',
    '2email'
),
(
    '3name',
    '3surname',
    '3email'
);

这就是查询最后的样子。

let data = [{name: '1name', surname: '1surname', email: '1email'},{name: '2name', surname: '2surname', email: '2email'},{name: '3name', surname: '3surname', email: '3email'}]

let QueryInsert = data.length > 0 ? 'INSERT INTO EXAMPLE (name,surname,email) VALUES ' : '';
data.forEach((el) => {
  QueryInsert = QueryInsert + `(${el.name},${el.surname},${el.email}),`
})

QueryInsert = QueryInsert.substring(0,QueryInsert.length-1);
console.log(QueryInsert)

相关问题