2012-10-23 25 views
0

我從一個ftp服務器接收到一個csv文件,我將它攝入一張表格中。 在收到文件時,我收到錯誤「文件是被截斷的文件」

實際原因是文件中的數據在行尾包含$和^ M $。 如:

ACT_RUN_TM,PROG_RUN_TM,US_HE_DT * ^M $ * 「確認」, 「」, 「3600」 $

我怎樣才能刪除這些$和結束^ M $該行使用linux命令。

+0

你在用什麼? – noel

+2

對答案的評論表明「^ M $」僅在VI中的設置中可見。 「$」不是實際文件的一部分,但^ M是。 –

回答

0

很奇怪地看到^ M不最最後一個字符,但:

的sed -e 's/^ M * \ $$ // G' <BADFILE> goodfile

或使用「sed -i」進行就地更新。 (請注意,通過按CTRL-V CTRL_M可以在命令行中輸入「^ M」)。

更新:它已經建立的問題是錯誤的,因爲「^ M $」是未在文件中但VI顯示。他實際上想要將CRLF對改爲LF。

SED -e 'S/^ M $ // G' <BADFILE> goodfile

+0

sed命令無法從行尾刪除^ M $和$(注意:^ M $和$僅在我設置時可見:vi編輯器中的列表 –

+0

@ArunPadule,它對我來說工作得很好注意在「^ M」和「\ $」之間的「*」可以選擇性地匹配它,它不一定是可見的,將'sed'的輸出傳送到'cat -v '看到特殊字符。 –

+0

OH!這些字符在您的文件中不是**,它們只是被顯示。讓我更新答案... –

3

的最終正確的解決方案是把文件從FTP服務器在文本模式傳輸,而不是二進制模式,它爲您做了適當的行尾轉換。更改您的下載腳本或FTP應用程序配置,以啓用文本傳輸以在將來修復此問題。

假設這是一次性傳輸並且您已經下載了該文件並且只是想修復它,您可以使用tr(1)來轉換字符。因此,要從文件中刪除全部控制-M個字符,可以通過tr -d '\r'進行管道傳輸。或者,如果您想用control-J取而代之 - 例如,如果文件來自OSX之前的Mac系統,則會執行此操作 - 執行tr '\r' '\n'