2016-04-29 67 views
0

我從顧客得到一個畸形的CSV,是缺少報價上的一列就這樣如何丟失的報價添加到CSV文件

"ID","Name","Org_ID","TransType","Amount" 
"1453","John Joe","AZ7629","CREDIT_CARD,"23.44" 

觀察CREDIT_CARD後失蹤的報價。它應該讀作「CREDIT_CARD」。 這個缺少的報價是打破我的處理器。 我需要預先處理csv,並在缺少它的任何行上添加缺少的報價。 有沒有一種方法來編寫腳本? 該處理在深夜之後運行,並且手動更新是NO-OP。 csv的製作者將會解決這個問題,但直到6月15日纔會完成。
請幫忙。

+0

CREDIT_CARD後,它始終還是不同領域的每一行?是否可以用'「,」'替換'「,」(不帶第二個引號)和',「(不帶第一個引號)?我正在考慮引號和逗號作爲有效的字段值。 –

+0

實際值有所不同,但始終是字母字符串。 –

+0

你知道角色','不會出現在引號內嗎? –

回答

1

awk來救援! 比sed更長,但更具可讀性(在我看來),可以檢測記錄哪些值被更新。

$ awk -v RS=[,\n] -v q='"' '!/^"/{b=q} !/"$/{e=q} 
          {printf "%s", b $0 e RT; b=e=""}' file 

記號化,並添加缺少的報價

+0

謝謝 - 我在劇本中使用了這個。 –

2

你可以使用sed

sed 's/\([^"]\),/\1",/' 
+1

添加'g'修飾符,否則它只會修復行中第一個缺失的報價。 – Barmar

+0

也可以添加就地編輯功能'-i' – sjsam

+1

謝謝,這可以工作..我有兩個潛在的修復程序,我會嘗試他們並報告回來非常感謝 –

1

假設每個字段必須括,您可以修復與確保有偶數個引號,直到記錄的末尾這個perl的命令行缺少收盤報價(否則會增加報價以逗號結束每個字段)

perl -pe 's/(?<=[^"\n])(?=(?:,"[^"]*")*$)/"/' file 
+0

謝謝,我會試試這個。 –