You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Bash脚本将数百万行的文本文件转换为MongoDB插入查询

用Bash脚本将百万行数字文本转换为MongoDB插入语句

刚好处理过类似的大规模数据导入需求,用Bash脚本完全可以搞定,而且要兼顾效率和格式的正确性——毕竟是百万行数据,格式错一个逗号都可能导致MongoDB执行失败。下面给你两个实用的方案,按需选择:

方案一:Sed + Echo 组合(简单易读)

这个方案逻辑直观,适合快速上手,通过Sed做文本替换,配合Echo拼接前后的MongoDB语句框架:

#!/bin/bash

# 替换为你的输入文件路径
INPUT_FILE="numbers.txt"
# 替换为你的目标集合名称
COLLECTION_NAME="database_name"

# 输出插入语句的开头部分
echo "db.${COLLECTION_NAME}.insert(["
# 将每行数字转换为指定格式,最后一行去掉末尾逗号
sed -e 's/^/  { "number":"&" },/' "$INPUT_FILE" | sed '$s/,$//'
# 输出插入语句的结尾部分
echo "]);"

逻辑说明:

  1. 第一个sed命令:把每行开头的数字,替换成 { "number":"数字" },的格式;
  2. 第二个sed命令:专门处理最后一行,去掉末尾的逗号(MongoDB不允许数组最后一个元素带逗号);
  3. 用echo拼接插入语句的首尾框架,完成整体格式。

方案二:Awk 实现(高效处理超大规模文件)

如果你的文件真的有数百万行,Awk会是更优选择——它只需要遍历文件一次,内存占用极低,处理速度比两次Sed的组合快很多:

#!/bin/bash

INPUT_FILE="numbers.txt"
COLLECTION_NAME="database_name"

# 输出开头框架
echo "db.${COLLECTION_NAME}.insert(["
# Awk逐行处理生成格式内容
awk '
    BEGIN { first_line = 1 }
    {
        # 从第二行开始,先输出逗号分隔符
        if (!first_line) print ","
        # 格式化输出当前行的数字
        printf "  { \"number\":\"%s\" }", $0
        first_line = 0
    }
    END { 
        # 输出结尾框架,确保格式闭合
        print "\n]);" 
    }
' "$INPUT_FILE"

逻辑说明:

  1. BEGIN块初始化标记,标记第一行不需要前置逗号;
  2. 遍历每行时,非第一行先输出逗号,再打印格式化后的对象;
  3. END块输出结尾的闭合语句,确保整个插入语句格式正确。

实用小贴士

  • 性能优化:百万级文件优先选Awk方案,避免两次遍历文件带来的时间损耗;
  • 输出到文件:如果需要生成可直接执行的MongoDB脚本,可将脚本输出重定向到文件:./convert_script.sh > insert_data.js,之后用mongo your_database insert_data.js执行;
  • 参数替换:记得把脚本里的numbers.txt和database_name替换成你实际的文件路径和集合名称;
  • 特殊字符处理:如果你的数字行里包含特殊字符(虽然题目里是纯数字),可以在Awk的printf里添加转义逻辑,比如处理双引号。

内容的提问来源于stack exchange,提问作者Mihiran Chathuranga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 01:37:39