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

PowerShell多文件逐行合并及按分隔符匹配关联数据实现咨询

文本结构化合并与块前缀追加实现方案

需求1:三对应行文件合并为分号分隔结构化数据

实现逻辑先校验三个文件行数一致,再逐行同步读取对应行内容拼接,避免出现行号不匹配的错误:

# 校验三个文件行数是否一致
line_count=$(wc -l < mobile.txt)
if [ $(wc -l < contract.txt) -ne $line_count ] || [ $(wc -l < name.txt) -ne $line_count ]; then
    echo "错误:三个文件行数不匹配"
    exit 1
fi

# 逐行拼接生成结构化文件 structured.csv
> structured.csv
for i in $(seq 1 $line_count); do
    mobile=$(sed -n "${i}p" mobile.txt | tr -d '\n')
    contract=$(sed -n "${i}p" contract.txt | tr -d '\n')
    name=$(sed -n "${i}p" name.txt | tr -d '\n')
    echo "${name};${mobile};${contract}" >> structured.csv
done

如果文件量级较大,可直接使用更高效的系统命令实现:paste -d ';' name.txt mobile.txt contract.txt > structured.csv

需求2:结构化数据按块追加前缀+死循环问题修复

死循环常见诱因:

  • 读取待拆分文件时未正确偏移读取位置,每次循环都从文件开头匹配Page分隔符,导致永远处理第一个块
  • Page分隔符的匹配规则过于宽松,块内内容也被识别为分隔符,块计数无限制增长永远达不到终止条件
  • 循环终止条件设置错误,未和结构化文件的固定行数绑定,而是用不可靠的文件读取状态判断

修复后的实现代码如下(默认分隔符为Page 数字格式,可根据实际规则调整匹配规则):

# 提前把结构化文件的每一行存入数组,避免循环中重复读取文件
mapfile -t struct_lines < structured.csv
struct_total=${#struct_lines[@]}

block_idx=0
current_block=()
output_file="merged_result.txt"
> $output_file

# 逐行读取带Page分隔符的待处理文件
while IFS= read -r line || [ -n "$line" ]; do
    # 匹配Page分隔符,可根据实际分隔符格式调整正则规则
    if [[ $line =~ ^Page\ [0-9]+$ ]]; then
        # 处理上一个已收集完成的块
        if [ $block_idx -gt 0 ] && [ $block_idx -le $struct_total ]; then
            prefix=${struct_lines[$((block_idx-1))]}
            for bline in "${current_block[@]}"; do
                echo "${prefix};${bline}" >> $output_file
            done
        fi
        block_idx=$((block_idx+1))
        current_block=()
        # 新增强制终止逻辑:块数超过结构化数据总行数直接退出,从根源避免死循环
        if [ $block_idx -gt $struct_total ]; then
            break
        fi
        continue
    fi
    # 非分隔符行存入当前块缓存
    if [ $block_idx -le $struct_total ]; then
        current_block+=("$line")
    fi
done < page_splitted_file.txt

# 处理最后一个未触发分隔符匹配的块
if [ $block_idx -le $struct_total ] && [ ${#current_block[@]} -gt 0 ]; then
    prefix=${struct_lines[$((block_idx-1))]}
    for bline in "${current_block[@]}"; do
        echo "${prefix};${bline}" >> $output_file
    done
fi

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:06:08