【问题标题】:How do you read a csv file into a two dimensional array in BASH?如何将 csv 文件读入 BASH 中的二维数组?
【发布时间】:2010-06-10 18:04:30
【问题描述】:

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

例如,如果我有一个看起来像这样的 csv 文件

AVERAGE     STDEV     MAX
17          18        19

AVERAGE     STDEV     MAX     MIN
17          18        19      1

【问题讨论】:

  • 这听起来有点像 bash (它甚至不直接支持二维数组)。为什么不使用 Perl 或 Python?
  • 可以使用两个一维数组。此链接介绍了从文件中读取以打包数组。不完全是您所要求的,但它可以帮助您以不同的方式看待问题。 link

标签: arrays bash csv shell


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    示例 27.17 中

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

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

    【讨论】:

      猜你喜欢
      • 2014-09-13
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2015-05-16
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      • 2014-12-25
      相关资源
      最近更新 更多