Node.js如何从.tgz归档内的文件夹中解压目标.csv文件
从tgz归档提取目标CSV文件实现方案
.tgz是gzip压缩的tar格式归档,你可以在现有CSV读取逻辑前增加归档提取步骤,以下是可直接落地的实现方式:
方案1:提取文件到本地目录(完全适配你现有读取代码)
这个方案会把归档内的目标CSV解压到你代码里写的固定路径,不需要改动原有读取逻辑。
- 先安装tar处理依赖:
npm install tar - 代码实现,注意要等解压操作完成后再执行文件读取,避免时序问题:
const fs = require('fs'); const tar = require('tar'); const { parse } = require('csv-parse'); // 替换成你本地list_users.tgz的实际存放路径 const ARCHIVE_PATH = '/your/real/path/list_users.tgz'; const WORK_DIR = '/home/some_project/'; async function main() { // 提取归档内的目标文件 await tar.x({ file: ARCHIVE_PATH, cwd: WORK_DIR, // 去掉归档内的out第一层目录,让csv直接落在WORK_DIR下,匹配你写的读取路径 strip: 1, // 只提取需要的csv文件,跳过归档内其他无关内容,提升速度 filter: (entryPath) => entryPath === 'out/list_users.csv' }); // 解压完成后执行你原有的CSV读取逻辑 const data = fs.readFileSync('/home/some_project/list_users.csv', 'utf8'); const records = parse(data, {columns: true}); // 后续业务逻辑直接处理records即可 } main().catch(err => { console.error('文件处理失败:', err); process.exit(1); });
方案2:内存直接读取文件,无需落盘
如果你不想把CSV文件解压到磁盘,可以直接在解压流中读取文件内容,省去磁盘写入步骤:
const fs = require('fs'); const zlib = require('zlib'); const tar = require('tar'); const { parse } = require('csv-parse'); const ARCHIVE_PATH = '/your/real/path/list_users.tgz'; let csvContent = ''; fs.createReadStream(ARCHIVE_PATH) // 先解压gzip层 .pipe(zlib.createGunzip()) // 解析tar包,只匹配目标csv文件 .pipe(new tar.Parse({ filter: (entryPath) => entryPath === 'out/list_users.csv' })) .on('entry', (entry) => { entry.on('data', (chunk) => { csvContent += chunk.toString('utf8'); }); }) .on('end', () => { // 内容读取完成后直接解析 const records = parse(csvContent, {columns: true}); // 后续业务逻辑处理records });
无额外依赖方案(仅限类Unix环境)
如果你的运行环境是Linux/macOS,也可以直接调用系统自带的tar命令完成提取,不需要安装npm依赖,但是Windows默认无tar命令,兼容性差:
const { execSync } = require('child_process'); // 执行系统tar命令提取目标文件,--strip=1去掉out目录层 execSync(`tar -xzf /your/real/path/list_users.tgz -C /home/some_project/ --strip=1 out/list_users.csv`); // 命令执行完成后直接运行你原有的读取逻辑即可
注意:不要在解压操作完成前就读取CSV文件,否则会出现文件不存在的报错。
内容的提问来源于stack exchange,提问作者yanni
相关产品推荐
相关产品推荐

