テーブルに取り込んでいる ftp サーバーから csv ファイルを受け取りました。ファイルの取り込み中に、「ファイルは切り捨てられたファイルでした」というエラーが表示されます
実際の理由は、ファイル内のデータの行末に $ と ^M$ が含まれているためです。例:
ACT_RUN_TM, PROG_RUN_TM, US_HE_DT* ^M$ * "確認済み","","3600" $
Linux コマンドを使用して、行末からこれらの $ と ^M$ を削除するにはどうすればよいですか。
テーブルに取り込んでいる ftp サーバーから csv ファイルを受け取りました。ファイルの取り込み中に、「ファイルは切り捨てられたファイルでした」というエラーが表示されます
実際の理由は、ファイル内のデータの行末に $ と ^M$ が含まれているためです。例:
ACT_RUN_TM, PROG_RUN_TM, US_HE_DT* ^M$ * "確認済み","","3600" $
Linux コマンドを使用して、行末からこれらの $ と ^M$ を削除するにはどうすればよいですか。
最終的に正しい解決策は、バイナリ モードではなくテキスト モードで FTP サーバーからファイルを転送することです。これにより、適切な行末変換が行われます。ダウンロード スクリプトまたは FTP アプリケーションの構成を変更して、テキスト転送を有効にし、今後これを修正してください。
これが 1 回限りの転送であり、既にファイルをダウンロードしており、それを修正したいだけであると仮定すると、tr(1) を使用して文字を変換できます。そのため、すべてのcontrol-M 文字をファイルから削除するには、パイプを介してtr -d '\r'
. または、それらを代わりに control-J に置き換えたい場合 – たとえば、ファイルが OSX 以前の Mac システムからのものである場合はこれを行います – do tr '\r' '\n'
.
^M が最後の文字ではないのは奇妙ですが、次のようになります。
sed -e 's/^M*\$$//g' <badfile >goodfile
または、「sed -i」を使用してその場で更新します。(「^M」は、 を押してコマンド ラインに入力することに注意してくださいCTRL-V CTRL_M
)。
更新: 「^M$」はファイルにはなく、VI で表示されるため、質問が間違っていることが確認されています。彼は実際には、CRLF ペアを LF だけに変更したいと考えています。
sed -e 's/^M$//g' <badfile >goodfile