Text-Processing

在包含欄位中的返回字元的 csv 文件中的每條記錄的末尾添加字元

  • October 9, 2020

我有一個 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 之類的工具。

引用自:https://unix.stackexchange.com/questions/613621