我从 ftp 服务器收到了一个 csv 文件,我正在将其摄取到表中。在摄取文件时,我收到错误“文件是被截断的文件”
实际原因是文件中的数据在行尾包含 $ 和 ^M$。例如:
ACT_RUN_TM、PROG_RUN_TM、US_HE_DT* ^M$ * "CONFIRMED","","3600" $
如何使用 linux 命令从行尾删除这些 $ 和 ^M$。
我从 ftp 服务器收到了一个 csv 文件,我正在将其摄取到表中。在摄取文件时,我收到错误“文件是被截断的文件”
实际原因是文件中的数据在行尾包含 $ 和 ^M$。例如:
ACT_RUN_TM、PROG_RUN_TM、US_HE_DT* ^M$ * "CONFIRMED","","3600" $
如何使用 linux 命令从行尾删除这些 $ 和 ^M$。
最终正确的解决方案是以文本模式而不是二进制模式从 FTP 服务器传输文件,这会为您进行适当的行尾转换。更改您的下载脚本或 FTP 应用程序配置以启用文本传输以在将来解决此问题。
假设这是一次性传输并且您已经下载了文件并且只想修复它,您可以使用 tr(1) 来翻译字符。因此,要从文件中删除所有control-M 字符,您可以通过tr -d '\r'
. 或者,如果你想用 control-J 替换它们——例如,如果文件来自预 OSX Mac 系统,你会这样做——做tr '\r' '\n'
.
看到 ^M 不是最后一个字符很奇怪,但是:
sed -e 's/^M*\$$//g' <坏文件>好文件
或使用“sed -i”就地更新。(注意,“^M”是在命令行中按 键输入的CTRL-V CTRL_M
)。
更新: 已确定问题是错误的,因为“^M$”不在文件中,而是与 VI 一起显示。他实际上想将 CRLF 对更改为 LF。
sed -e 's/^M$//g' <坏文件>好文件