使用bash读取csv中未定义的列数



使用Bash脚本读取CSV文件很容易:

csvseparator=";"
while IFS="$csvseparator" read -r column1 column2 column3
do
printf "%s - %s - %sn" "$column1" "$column2" "$column3"
done < /path/to/csv_file.csv

但我有一个问题,因为我不知道CSV文件的列数(可能第一行有3列,第二行有10列,第三行有2列,第四行有50列,…(

一种可能的解决方案是用分隔符分隔行,并将每列添加为数组值,但我认为会有更好的解决方案。是否可以在不知道每行的列数的情况下读取每一列?

Bash不是,特别擅长读取随机CSV,因为如果有带引号的字段,则无法在分隔符上进行拆分。例如,

"This,is,one,field","This is another"

包含两个字段,不带引号的逗号将它们分隔开。

如果CSV文件的每行包含的列数不相同,那么它的格式就不好。

但是,您当前问题的答案可能是使用数组。

while IFS='' read -r row; do
readarray -d "$csvseparator" fields <<<"$row"
printf "%i fields:n" "${#fields[@]}"
printf "%sn" "${fields[@]}"
done <csvfile

如果出于任何原因不想使用数组(也许Bash太旧了?(,也可以简单地使用set将其拆分为字段。

oldifs=$IFS
while IFS='' read -r row; do
IFS=$csvseparator
set -- $row
IFS=$oldifs
printf "%i fields:n" "$#"
printf "%sn" "$@"
done <csvfile