Linux环境下PostgreSQL导入TSV时出现字面回车错误求助
解决PostgreSQL导入TSV时的“literal carriage return”错误
你遇到的这个错误大概率是因为TSV文件里藏着实际的回车符(\r,也就是Windows风格换行符里的那个额外字符),而PostgreSQL的文本导入解析器默认只认Unix风格的换行符(\n),碰到单独的\r就会触发这个报错。结合你的环境和试过的方法,给你几个可行的解决方案:
1. 先检查并修复文件的换行符
先确认文件里确实有多余的回车符:
cat -A /home/super/Downloads/folder/myfile.tsv
这个命令会把文件里的不可见字符显形——如果看到^M,那就是Windows风格的\r\n换行符在搞鬼。
修复的话直接用dos2unix转成Unix格式:
dos2unix /home/super/Downloads/folder/myfile.tsv
转换完再用原来的\copy命令或者Pgadmin3导入,应该就能解决问题。
2. 不修改原文件,在\copy命令里过滤回车符
要是不想改动原文件,可以在tail输出后加一步过滤,用tr命令删掉所有回车符:
\copy your_table_name FROM PROGRAM 'tail -n +2 /home/super/Downloads/folder/myfile.tsv | tr -d ''\r''' WITH (FORMAT tsv, NULL '\N', ENCODING 'UTF8');
这里明确指定了格式为tsv,空值字符串是\N,同时通过管道把所有\r字符去掉,避免解析报错。
3. 调整Pgadmin3的导入设置
在Pgadmin3的导入对话框里,除了设置编码为UTF8,还得做这些调整:
- 选择“格式”为文本
- 设置“字段分隔符”为制表符(直接输入
\t就行) - 在“选项”里,把“空值字符串”设为
\N - 如果文件是Windows换行符,试试在“行分隔符”里输入
\n,或者勾选“忽略回车符”(如果有这个选项的话)
4. 改用CSV格式指定参数的方式导入
有时候TSV的默认解析会有歧义,改用CSV格式但指定制表符分隔,反而更稳定:
\copy your_table_name FROM PROGRAM 'tail -n +2 /home/super/Downloads/folder/myfile.tsv' WITH ( FORMAT csv, DELIMITER E'\t', NULL '\N', ENCODING 'UTF8', HEADER false );
这里明确告诉PostgreSQL用制表符分隔,空值是\N,同时关闭表头(因为你用了tail跳过第一行)。
内容的提问来源于stack exchange,提问作者thleo
相关产品推荐
相关产品推荐

