Text-Processing
在包含欄位中的返回字元的 csv 文件中的每條記錄的末尾添加字元
我有一個 csv 文件,其中包含不同長度的 5 列。列之間的分隔符是
","
,最後一列以 . 結尾"
。行分隔符是換行符。最新的文件有換行符,我必須保留在最後一列的文本中。我正在使用每行末尾的換行符作為記錄分隔符來導入此文件,但現在由於最後一列文本中的換行符,導入器出錯了。辨識換行符在其中一個欄位中是不夠聰明的。因此,為了正確導入它,我必須創建一個新的行尾分隔符並使用 shell 命令將其插入每行的末尾,以便我用來導入它的 db 腳本可以判斷該行何時是完成的。
任何常用命令中都沒有 gnu 功能,這使其更加困難。我在 AIX 上使用 kornshell。我無法安裝其他軟體。
例子:
"id1","column2 with text","3","4/4/2044","the column that messes everything up" "id2",""column2 with text","42","9/9/2099","oh no, not again !!"
使用 shell 命令(awk、sed、perl、tr 等)和 |@| 作為分隔符,我如何在每一行的末尾插入一個新的分隔符,以便在上面的範例中,第 1 行將終止:
that messes everything up"|@|
第 2 行將終止於:
!!"|@|
我不需要刪除每行末尾的換行符,如果它不是行尾分隔符的一部分,導入器將忽略它。
如果我們可以安全地假設所有記錄都以 a
"
後跟換行符結尾,並且我們看到 a"
後跟換行符的唯一一次是在記錄的末尾,那麼這相對簡單:$ sed 's/(.*")$/\1|@|/' file "id1","column2 with text","3","4/4/2044","the column that messes everything up"|@| "id2",""column2 with text","42","9/9/2099","oh no, not again !!"|@|
或者,在 : 之後允許一些空格
"
:sed 's/"[[:blank:]]*$/"|@|/' file
當然,這並不穩健。您很可能在欄位中使用雙引號,因為這在 CSV 文件中是允許的,這意味著您可能在欄位中和換行符之前使用它們。如果發生這種情況,那麼我的簡單方法將失敗,您確實需要編寫適當的解析器或使用具有適當 csv 解析器的 perl 或 python 之類的工具。