使用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