将 csv 文件中的每一列分配给一个数组

Assigning each column in a csv file to an array

NameColumn1;NameColumn2;NameColumn3;NameColumn4
Row1;Row1;Row1;Row1;
Row2;Row2;Row2;Row2;
Row3;Row3;Row3;Row3;

我遇到了一个例子,有人想获取以下信息(上图)并将它们存储在变量中。解决方案是创建一个循环,将数据全部附加到常规变量中:

#!/usr/bin/env bash

while IFS=';' read -ra array; do
  ar1+=("${array[0]}")
  ar2+=("${array[1]}")
  ar3+=("${array[2]}")
  ar4+=("${array[3]}")
done < file.csv

而不是 ar1-4 包含每一列中的所有数据,我更愿意将这些数据分隔在一个数组中,这样我就会有一个 col1(x), col2(x), col3(x), col4 (x) 和 x 将代表包含单个值的行。这在 bash 中可行吗?

我尝试创建自己的版本,但收到一条错误消息,提示“无法将列表分配给数组成员”。这是生成错误消息的修改版本。第一行中的第一个值包含 header。我通过将“echo ${array[0]}”插入循环来检查值,它显示“Employee Payroll”(不带引号):

  while IFS=, read -ra array
  do
    col1[$x]=("${array[0]}")
    col2[$x]=("${array[1]}")
    col3[$x]=("${array[2]}")
    col4[$x]=("${array[3]}")
    col5[$x]=("${array[4]}")
    col6[$x]=("${array[5]}")
    col7[$x]=("${array[6]}")
    col8[$x]=("${array[7]}")
    x+=1
  done < "$importfile"

谢谢!

显然,删除单词数组周围的 (" ") 解决了这个问题。这是工作代码。

  while IFS=, read -ra array
  do
    echo ${array[0]}
    col1[$x]=${array[0]}
    col2[$x]=${array[1]}
    col3[$x]=${array[2]}
    col4[$x]=${array[3]}
    col5[$x]=${array[4]}
    col6[$x]=${array[5]}
    col7[$x]=${array[6]}
    col8[$x]=${array[7]}
    x+=1
  done < "$importfile"