2012-10-08 170 views
2

我有一個要求在shell中讀取CSV文件,那麼我確定單元格中有單行的CSV文件。但是,如果我們在CSV文件的單元格中有多行,那麼我無法分隔CSV文件。在bash中讀取一個CSV文件

Filename   Lines 
/etc/hosts   example.test.com 
        example2.test.com 
/etc/resolv.conf nameserver dns.test.com 
        search test.com 

我會從一個CSV文件中的用戶輸入,並具有給定的行添加到提檔。這裏有一個CSV文件的每個單元格中有多行,如果我嘗試捕捉它以不同的順序給出的文件。

[[email protected] ~]$ cat test2.csv 
"Filename","Lines" 
"/etc/hosts","example.test.com" 
,"example2.test.com" 
"/etc/resolv.conf","nameserver dns.test.com" 
,"search test.com" 

有什麼辦法可以從該文件中讀取多行,並且行數總是不一樣。

+0

http://stackoverflow.com/questions/1560393/bash-shell-scripting-csv解析 –

+0

給出數據文件;在'bash'中你想用它做什麼?如標準輸出所示重新格式化它?或者將數據存儲在'bash'數組中?或者是其他東西? –

+0

http://stackoverflow.com/questions/12739515/ – Vahid

回答

2

這可能是你追求的:

awk -F, '{ sub(/^"/, "", $1); sub(/"$/, "", $1); 
      sub(/^"/, "", $2); sub(/"$/, "", $2); 
      printf "%-20s %s\n", $1, $2; 
     }' 

這可能是可能的,如果你花更多的時間手動撲壓縮替代操作。這是一個脆弱的解決方案(大多數解決方案不使用專門處理CSV格式的代碼是脆弱的);如果逗號出現在任何引用字段內,它將會失敗。

適用於你的數據,它產生:

Filename    Lines 
/etc/hosts   example.test.com 
         example2.test.com 
/etc/resolv.conf  nameserver dns.test.com 
         search test.com 

其他可能的工具來操作可靠CSV格式的數據包括:

如果這不是你要找的,請澄清這個問題。

+0

感謝您的輸入,它真的很有幫助,輸入將具有幾乎所有的特殊字符..是否有任何方式可以從我們可以實現的其他編程語言perl的。有什麼方法可以直接調用CSV文件的單元格號碼嗎? –

+0

大多數CSV文件都沒有手機,所以你不能打電話給他們:D我很不確定你在做什麼。但是,如果您正在尋找可包含任意數據(包括引號字段中的逗號等)的CSV文件的第78行第4列,則需要一個專用的CSV識別模塊。我在答案中列出了2個選項。在這兩者中,我可能會使用Perl,但我已經使用Perl大約20年了,所以我非常習慣它。 'csvfix'程序是用C++編寫的,可以做很多非常有用的技巧;我不確定它是否可以管理第79行,第4列(但它可能會這樣做)。 –

+0

感謝喬納森,請讓我知道我們如何用Perl來做到這一點。在我看來,單元號碼只不過是彩色號碼。 –

2

假設你輸入基本爲你的榜樣,你也許能逃脫簡單地做:

sed 's/^,/ ,/' test2.csv | tr -d \" | column -s, -t 
+0

downvote有什麼用途?很明顯,該解決方案沒有聲明穩健性或可靠性,沒有評論的6個月大的解決方案只是簡單的粗魯! –