你如何在BASH中将csv文件读入二维数组?

时间:2010-06-10 18:04:30

标签: arrays bash csv shell

如何在BASH中将csv文件读入二维数组?该脚本需要足够动态,它可以采用具有可变行数和列数的csv文件。

例如,如果我有一个看起来像

的csv文件
AVERAGE     STDEV     MAX
17          18        19

AVERAGE     STDEV     MAX     MIN
17          18        19      1

2 个答案:

答案 0 :(得分:4)

模拟二维数组的一种方法是将行保存为一维数组中的字符串,并在每次迭代时解压缩它们。您必须选择一个未出现在数据中的合适分隔符。既然你提到了CSV,我会使用逗号,但这不足以通过嵌入式逗号来处理这样的数据:

name, start date, visits, games, balance
"Williamson, Dennis", "January 11, 2007", 12, 42, 17000

这是一个迭代模拟二维数组中值的简单示例:

# avg, stddev, max, min
data_array=(
            "17,18,19,1"
            "12,14,16,2"
            "6,8,10,3"
            )

saveIFS=$IFS

for row in ${data_array[@]}
do
    IFS=","
    cols=($row)
    IFS=$saveIFS
    for col in ${cols[@]}
    do
        newval=$(do_something $col)
    done
done

可以更改数组的内容:

rowidx=2
colidx=2
IFS=","
cols=(${data_array[rowidx]})
cols[colidx]=$some_value
data_array[rowidx]="${cols[*]}"
IFS=$saveIFS

正如你所看到的那样,它很快变得复杂,并且有很多我没有提到过的问题。使用Python。

答案 1 :(得分:0)

bash仅支持一维数组。要查看2维的模拟,请查看 高级bash脚本指南中的twodim.sh:

示例27.17 in

http://tldp.org/LDP/abs/html/arrays.html

我同意这听起来像家庭作业。