2016-07-28 122 views
0

我正在检查用于读取CSV文件的shell脚本,然后将数据插入到数据库中。读取CSV时,shell脚本读取命令如何处理未使用的列?

脚本有类似

#!/bin/bash 

FILENAME='MyFile.csv' 
OLDIFS=$IFS 
IFS=, 
LINE=0 
while read foo bar baz boo 
do 
    LINE=$(($LINE+1)); 
    if [ $LINE != 1 ] 
    then 
     if [ -z "$bar" ] 
     then 
      bar=-1 
     fi 
     if [ -z "$baz" ] 
     then 
      baz=-1 
     fi 
     if [ -z "$boo" ] 
     then 
      boo='NULL' 
     fi 
fi 

done <$FILENAME 
IFS=$OLDIFS 

如果我的CSV文件结构

foo, bar, baz, boo, zee, wee 
1, 2, 3, 4, 5, 6 
7, 8, 9, 10, 11, 12 

如何read反应不会在最后两列阅读的结构?我假设数据只是被忽略,并且在循环的每次迭代期间,只有前四列被读入变量?

我也找不到if fi陈述中有关-z的任何信息,我假设它代表“如果值等于零”?

+0

不要全局更改'IFS'的值;只需将其前缀添加到'read'命令即可。 '而IFS =,读foo bar baz boo; do'。 – chepner

回答

3

Bash Manual(重点煤矿):

一行从标准输入中读取,或提供作为参数向-u选项从文件描述符FD,并且所述第一字分配到第一个名称,第二个字到第二个名称等等,带有剩余字和它们的中间分隔符分配给最后的名称

所以在你的情况下,boo将有每行的其余数据。

-z测试也描述在Bash手册的Bash Conditional Expressions下。简而言之:

真,如果字符串的长度为零。

2

read不忽略最后两列;它只是提前停止分裂。如果您检查boo的值,则会看到它包含类似boo, zee, wee的值。你至少需要多一个变量来保存后克鲁夫特:

while IFS=, read foo bar baz boo everythingelse; do 
    ... 
done < "$FILENAME" 

-z测试字符串参数的长度。要测试值为零,您需要使用=(或-eq,如果您知道该字符串看起来像一个整数)。

if [ "$bar" -eq 0 ]; then 
    bar=-1 
fi 

注意逗号后的空格是从变量的值剥离。第一行的bar的值为<space>2,而不是2