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确保读取每行时保留行首空格,且不转义反斜杠,避免内容丢失或变形。
注意事项:
- 该脚本需要bash 4.0及以上版本,低版本bash不支持关联数组。
- 如果CSV中存在重复键,后续的键值对会覆盖之前的记录,若需保留重复键需额外调整逻辑。
- 脚本默认续行以空白开头、键值以第一个空格分隔,若你的CSV格式有其他规则,可修改对应判断或分割逻辑。
内容的提问来源于stack exchange,提问作者Dheeraj
相关产品推荐
相关产品推荐

