2015-10-15 43 views
3

我們有一個數據源向我們發送我們需要自動導入到我們系統中的文件,但是經常會有其中的額外CRLF形式的壞數據一些記錄的一個或兩個字段。該文件是一個CSV格式文件和我原本以爲我已經修復了問題,這樣的:需要一種從記錄中間剝離額外CRLF的方法

awk 'NR%2-1{gsub(/\r?\n/, FS)} NR>1{printf RS}1' RS=\" ORS= input.csv > output.csv 

這對於有引號內的額外CRLFs記錄偉大的工作,但事實證明我們還會得到一些沒有引號的記錄,它們會拋出awk命令。

每條記錄​​中的最後一個字段是一個由4-7位數字組成的數字字段,有沒有一種方法可以將該字段用作引用來保留該字段後面的CRLF並刪除其餘字段?

或者,有沒有辦法通過計算字段並在記錄的最後一個字段之前刪除它們來剝離CRLF?

輸入如下:

SMITH,John,,,,,,05/10/1966,,USA,USA,A 5551212,"Resides in California, USA",,,,Mill Valley,,,,,USA,"Northern District of California, USA",Individual,,,12/09/2003,18/08/2015,78452 
SMITH,Patty,,,,,,05/10/1974,,USA,USA,A 5551212,"Resides in Oregon, USA",,,,Portland,,,,,USA,"District of Oregon, USA",Individual,,,15/09/2002,02/02/2015,121567 

問題記錄看起來如下 - 注意回車和失蹤報價:

SMITH,Bill,,,,,,05/10/1966,,USA,USA,A 5551212,"Resides in California, USA",,,,Mill Valley,,,,,USA,Northern District of 
California, USA,Individual,,,12/09/2003,18/08/2015,78452 

對於輸出我們需要的紀錄是一樣的其他兩個 - 全部在一條線上:

SMITH,Bill,,,,,,05/10/1966,,USA,USA,A 5551212,"Resides in California, USA",,,,Mill Valley,,,,,USA,Northern District of California, USA,Individual,,,12/09/2003,18/08/2015,78452 
+0

顯示帶有和不帶引號的示例有效和損壞的輸入?併爲這些輸入你想要的輸出。 –

+0

向問題添加了輸入和所需的輸出。 – barc0001

+0

http://stackoverflow.com/q/4205431/258523中提到的'csv.awk'腳本可能對您有用。 –

回答

1

如果您只需要清除字段內部CRLFs,請嘗試以下(假設GNUawk,但它可以製成與BSD awk工作以及):

awk -v RS='\r?\n' '/,[[:digit:]]{4,7}$/ { print; next } { printf("%s ", $0) }' input.csv > output.csv 
  • /,[[:digit:]]{4,7}$/只匹配在4-7數字結尾的行,這意味着手頭的線是一條完整的記錄或者是多線記錄的最後一條線。
    • { print; next }簡單地打印一行以終止\n(如果你想在輸出\r\n太,你不得不使用printf("%s\r\n", $0)代替)。
  • { printf("%s ", $0) }然後只印刷備案片段,即,其具有的場內部CRLF,因此繼續進行下一行的記錄;通過使用printf和僅僅尾部空格來打印它,最終效果是由單個記錄組成的多行與輸出上的每個空格有效地結合。
+0

使用GNU awk 3.1.7。最初的代碼剝離了所有CRLF,但將所有內容都留作一條大線。更改{print;下一個}到{printf(「%s \ r \ n」,$ 0)}對輸出沒有任何影響。我誤解了嗎? – barc0001

+0

@ barc0001:v3.1.7相當老 - 當前是4.1.3;你能[升級](http://ftp.gnu.org/gnu/gawk/)?除此之外:輸入全部是CRLF還是混合了CRLF和LF?你希望輸出是全CRLF還是全LF? – mklement0

+0

升級可以做到。沒有意識到這是過時的。輸入全部是CRLF是,CRLF的輸出是過程下一步的預期結果。 – barc0001