2016-07-28 36 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

相關問題