使用 sed 在文件中的每一行末尾附加字符串会导致未引用的换行符错误
Append string at the end of each line in a file with sed causes unquoted newline error
我试图在使用 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
不处理。它会转换您的文件,以便 job_id 插入 cr
和 lf
之间。
我试图在使用 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
不处理。它会转换您的文件,以便 job_id 插入 cr
和 lf
之间。