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
相关产品推荐
相关产品推荐

