在带有sed的文件中的每行末尾附加字符串会导致未加引号的换行错误



在使用psql加载到Postgres之前,我试图将job_id字段附加到CSV文件中。这应在Python脚本中执行。

cmd = f""" 
psql {con} -c "COPY raw.{tablename} FROM PROGRAM 'sed ''s/.*/&,"{job_id}"/'' /airflow/stage/test-{job_id}/{filename}' HEADER CSV"
"""
result = subprocess.run(cmd, shell=True, executable='/bin/bash', stderr=subprocess.PIPE)

以上导致以下记录的错误。

[2021-06-27 00:35:08,527] {logging_mixin.py:104} INFO -         psql postgres://user:password@10.0.0.15:5432/test -c "COPY raw.testdata FROM PROGRAM 'sed ''s/.*/&,"20210626T155818"/'' /airflow/stage/test-20210626T155818/testdata.csv' HEADER CSV"
[2021-06-27 00:35:08,568] {logging_mixin.py:104} INFO - ERROR:  unquoted newline found in data
HINT:  Use quoted CSV field to represent newline.

如果不执行上面的字符串附加操作就可以成功加载文件。在不影响换行的情况下,将字符串附加到每行的正确方法是什么?

您的输入文件使用DOS行尾约定,即如果每行的末尾都有cr-lf对。只要它是一致的,COPY就处理这个精细,但sed不处理。它转换您的文件,以便在crlf之间插入job_id。

最新更新