2016-02-12 185 views
0

我有非常大的包含原始數據的.csv文件。許多字段具有前導空格和尾隨空格,並且許多應該在字符組/字之間僅具有一個空格的多字段字段值具有額外的空格,例如,使用命令行修剪csv文件

'12 Anywhere Street' 

這應該是:

'12 Anywhere Street' 

領先,尾隨和額外的空間變化,從一個額外的空間六個多餘的空格。我可以將文件加載到我的數據庫並運行腳本來修剪它們。前後修剪腳本運行良好,並且可以快速執行;但是,刪除單詞之間多餘空格的腳本要花費更長和更長的時間。在將它加載到我的數據庫之前,使用命令行刪除原始.csv文件中的單詞之間的多餘空格會更好。

我基本上需要運行一個替換函數,它將「」的任何實例替換爲「」,「」,「」,....最多六個空格左右。我非常感謝能夠實現這一點的一些協助。

+0

你在使用什麼操作系統? Linux呢?請在你的問題中提及它。你也可以舉幾個你的數據文件的例子嗎? – Wossname

+0

使用Windows,但可以輕鬆創建一個Linux實例來執行此操作。單詞之間具有額外空格的列包含(按字段引用)'姓和名','街道地址','城市','字符串句子格式'。某些表/ .csv文件比其他表格有更多的空格。我希望有所幫助。 – pbnyc

+0

消息框自動刪除空格。 – pbnyc

回答

0

在本回復的第1部分中,我將首先假設您的CSV文件有一個不在任何字段內出現的字段分隔符(稱爲「,」)。在第2部分中,我將處理更一般的情況。

第1部分:

awk -F, ' 
    function trim(s) { 
    sub(/^ */,"",s); sub(/ *$/,"",s); gsub(/ */," ",s); return s; 
    } 
    BEGIN {OFS=FS} 
    {for (i=1;i<=NF;i++) { $i=trim($i) }; print }' 

第2部分:

爲了處理一般情況下,最好使用CSV感知工具(如Excel或csv2tsv命令之一在線工具)將CSV轉換爲簡單的格式,其中值分隔符不會在字面值內出現。 TSV格式(帶有製表符分隔的值)是特別合適的,因爲它允許在選項卡中包含製表符。

然後使用awk -F"\t"而不是awk -F,運行上述awk命令。

要恢復原始格式,請使用諸如Excel,tsv2csv或jq之類的工具。這裏是JQ咒語假設你希望有一個「標準」的CSV文件:

jq -Rr 'split("\t") | @csv' 

在緊要關頭,下面可能就足夠了:

awk -F"\t" ' 
BEGIN{OFS=","; QQ="\"";} 
    function q(s) { if (index(s,OFS)) { return QQ s QQ }; return s} 
    function qq(s) { gsub(QQ, QQ QQ, s); return QQ s QQ } 
    function wrap(s) { if (index(s,QQ)) { return qq(s) } return q(s)} 
    { s=wrap($1); for (i=2;i<=NF;i++) {s=s OFS wrap($i)}; print s}' 
+0

在Excel中編輯文件不是一個選項。如果是這樣,修剪將很簡單。 – pbnyc

0

在MacOS或Linux,你可以這樣做:

cat data.csv | tr -s [:space:] > formatted.csv 

這不會削減每個值,但會刪除所有重複的空格。也許這會讓你走。

+0

這將刪除多餘的空間,但不會削減每個值。 – peak

+0

你說得對。我澄清了。 –