在使用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
不处理。它转换您的文件,以便在cr
和lf
之间插入job_id。