如何读取n列CSV文件以检查它们是否为空?

时间:2014-03-11 03:43:29

标签: arrays linux bash variables csv

我正在尝试阅读具有此格式的电子表格

username,   lastname,   firstname,    x1,      x2,       x3,      x4
user1,       dudette,    mary,         7,       2,                 4
user2,       dude,       john,         6,       2,        4,
user3,       dudest,     rad,
user4,       dudaa,      pad,          3,       3,        5,       9

基本上,它具有用户名,用户名对应的名称以及每个x的值。我想要做的是从csv文件中读取,然后找到所有空格并用5s填充它们。我这样做的方法是读入整个数组,然后用0替换所有null空格。到目前为止这是代码......

我得到的解决方案,感谢stackoverflow的另一位受访者,

n=5
while IFS=, read username lastname firstname x1 x2 x3 x4; do
    ! [[ $x1 ]] && x1=$n
    ! [[ $x2 ]] && x2=$n
    ! [[ $x3 ]] && x3=$n
    ! [[ $x4 ]] && x4=$n
    echo $username,$lastname,$firstname,$x1,$x2,$x3,$x4
done < something.csv > newfile.csv && mv newfile.csv something.csv

在过去的几个小时里,我一直在试图找出如何将其扩展为n列案例。所以在上面的例子中,我知道我有7列,所以我读了七个变量。我现在要做的是弄清楚如何将它扩展到n列的情况。即使添加了另一列,我仍然需要代码才能工作。

2 个答案:

答案 0 :(得分:1)

awk更适合这种类型的csv解析和格式化。

awk -F '[, ]+' -v n=7 '{for (i=1; i<=n; i++) printf "%10s%s", $i, (i<n)?OFS:RS}' OFS=, x
  username,  lastname, firstname,        x1,        x2,        x3,        x4
     user1,   dudette,      mary,         7,         2,         4,          
     user2,      dude,      john,         6,         2,         4,          
     user3,    dudest,       rad,          ,          ,          ,          
     user4,     dudaa,       pad,         3,         3,         5,         9

答案 1 :(得分:0)

Anubhava的回答应该更快(因为它是awk,而不是bash)。我正在添加一个答案,仅仅是为了回答有关如何将read扩展到n列的问题。

n=5
while IFS=, read -a columns; do
    for i in ${!columns[@]}; do # * NOTE1
        [ "${columns[$i]}" ] || columns[$i]=$n
    done
    printf "%s" ${columns[0]}; printf ",%s" ${columns[@]:1} # * NOTE2
done < something.csv > newfile.csv && mv newfile.csv something.csv

注1:如果条目为空,但存在占位符,请按原样使用for循环。
如果csv文件中的列数未修复(例如,检查user3行),则将内部for循环更改为for ((i=0;i<$max_columns;i++)); do

注2:如果需要,在printf命令中,将%s更改为%10s