我有一个 csv 文件,其中有 5 列,长度各不相同。列之间的分隔符是","
,最后一列以 结尾"
。行分隔符是换行符。最新的文件有换行符,我必须将其保留在最后一列的文本中。
我使用每行末尾的换行符作为记录分隔符导入此文件,但现在导入器由于最后一列文本中的换行符而出现错误。它不够聪明,无法识别换行符位于其中一个字段中。因此,为了正确导入它,我必须创建一个新的行尾分隔符,并使用 shell 命令将其插入到每行的末尾,以便我用来导入它的数据库脚本可以告诉该行何时是完成的。
任何常用命令都没有 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 行将终止于:
!!"|@|
我不需要删除每行末尾的换行符,如果它不是行尾分隔符的一部分,导入器将忽略它。
答案1
如果我们可以安全地假设所有记录都以 a"
后跟换行符结尾,并且我们唯一一次看到 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 等工具。