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

Arrays 如何在BASH中将csv文件读入二维数组?,arrays,bash,csv,shell,Arrays,Bash,Csv,Shell,如何在BASH中将csv文件读入二维数组?脚本需要具有足够的动态性,以便能够接收具有可变行数和列数的csv文件 例如,如果我有一个csv文件 AVERAGE STDEV MAX 17 18 19 或 bash只支持一维数组。要查看二维模拟,请签出 高级bash脚本指南中的twodim.sh: 示例27.17英寸 我同意这听起来像是家庭作业。模拟二维数组的一种方法是将行作为字符串保留在一维数组中,并在每次迭代时解压。您必须选择一个不出现在数据中的

如何在BASH中将csv文件读入二维数组?脚本需要具有足够的动态性,以便能够接收具有可变行数和列数的csv文件

例如,如果我有一个csv文件

AVERAGE     STDEV     MAX
17          18        19


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

示例27.17英寸


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

模拟二维数组的一种方法是将行作为字符串保留在一维数组中,并在每次迭代时解压。您必须选择一个不出现在数据中的合适分隔符。既然您提到了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。

对于bash(它甚至不直接支持二维数组)来说,这听起来有点过分。为什么不使用Perl或Python呢?
rowidx=2
colidx=2
IFS=","
cols=(${data_array[rowidx]})
cols[colidx]=$some_value
data_array[rowidx]="${cols[*]}"
IFS=$saveIFS