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

Linux:如何读取含多行值的CSV文件数据并存储到数组

处理含多行值的CSV并存储为键值对数组

你的问题核心是要识别CSV中属于同一键的多行续行,将其合并为对应键的值。可以通过判断行首空白的方式区分新键行和续行,用bash关联数组存储键值对,具体脚本如下:

#!/bin/bash
# 开启扩展匹配(用于移除行首所有空白字符)
shopt -s extglob

# 定义关联数组存储键值对
declare -A kv_map
# 变量跟踪当前正在处理的键
current_key=""

# 逐行读取文件,保留行首空格
while IFS= read -r line; do
    # 判断当前行是否为续行(行首以空白字符开头)
    if [[ $line =~ ^[[:space:]]+ ]]; then
        # 移除行首所有空白,追加到当前键的值中(保留换行格式)
        trimmed_line=${line##+([[:space:]])}
        kv_map[$current_key]+=$'\n'"$trimmed_line"
    else
        # 分割新键与对应值(以第一个空格为分隔符)
        IFS=' ' read -r key rest <<< "$line"
        current_key="$key"
        kv_map[$current_key]="$rest"
    fi
done < test.csv

# 验证输出结果
echo "读取到的键值对:"
echo "-----------------"
for key in "${!kv_map[@]}"; do
    printf "键: %s\n值:\n%s\n\n" "$key" "${kv_map[$key]}"
done

关键逻辑说明:

  • 关联数组:用declare -A定义关联数组kv_map,支持以字符串作为键存储对应值,完全匹配你的键值对存储需求。
  • 续行识别:通过正则^[[:space:]]+判断行首是否为空白,以此确定该行属于上一个键的续行内容。
  • 内容合并:续行时先移除行首空白,再通过$'\n'添加换行符,将内容追加到对应键的值中,保证多行格式完整。
  • 完整读行:IFS= read -r line确保读取每行时保留行首空格,且不转义反斜杠,避免内容丢失或变形。

注意事项:

  1. 该脚本需要bash 4.0及以上版本,低版本bash不支持关联数组。
  2. 如果CSV中存在重复键,后续的键值对会覆盖之前的记录,若需保留重复键需额外调整逻辑。
  3. 脚本默认续行以空白开头、键值以第一个空格分隔,若你的CSV格式有其他规则,可修改对应判断或分割逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 12:53:12