簡體   English   中英

從Windows到Linux的文件傳輸

[英]file transfer from Windows to Linux

我正在使用ssis將數據導出到csv文件中。 在我的sis軟件包中,我以zip格式壓縮文件,然后使用sftp將其上傳到Linux服務器上。 問題在於,在目標文件系統中,csv文件包含來自DOS系統的^ M字符。

我找到了三種解決方案。

  • 首先,我可以將sftp傳輸模式設置為ascii而不是壓縮文件(我后來發現這僅受ftp支持)。 考慮到我解壓縮后的文件> 3Gb效率不高,因此上傳需要一段時間。

  • 其次,一旦傳輸,我可以解壓縮文件並使用dos2unix實用程序將其轉換,但是再次沒有安裝dos2unix,並且我無權將其安裝到目標系統。

  • 最后,我可以使用sed之類的unix編輯器從行尾刪除^ M。 我的文件包含超過400萬行,這又需要花費很多時間。

問:有什么方法可以使用sis將ASCII文件預格式化,然后壓縮並傳輸?

我沒有嘗試過,但是我認為您可以在輸出到csv文件時進行CR + LF-> LF轉換。 我在這里看了這個鏈接

向下滾動到“標題行定界符”部分。 看來,如果選擇{LF}作為行定界符,則生成的.zip文件將正確顯示在Linux框中。

順便說一句,也許您知道,但是我不得不提到^ M是Linux / Unix框中CR的表示。

順便說一句,在大多數情況下,Linux中的^ M不是問題,只是一些令人討厭的事情。

希望我能幫上忙!

在搜索此問題時,我發現了一個非常有用的鏈接,它們描述了此問題的原因和可能的解決方法:

原因

文件已在具有不同換行符約定的不同類型的系統之間傳輸。 例如,基於Windows的文本編輯器在行尾將帶有特殊的回車符(CR + LF),以表示行返回或換行符,這些字符在Linux(^ M)中將無法正確顯示。 這可能很難發現,因為某些應用程序或程序可能會正確處理外來換行符,而其他應用程序或程序則無法。 因此,某些服務可能會崩潰或無法正確響應。 通常,這是因為文件是在Microsoft Windows計算機上創建或什至在文件中編輯,然后上傳或傳輸到Linux服務器。 當從沒有ASCII或文本模式的MS-DOS(或MS-Windows)傳輸文件時,通常會發生這種情況。


可能的解決方案

(1)使用dos2unix命令

dos2unix包括實用程序,可將帶有DOS或MAC換行符的文本文件轉換為Unix換行符,反之亦然。 它還包括將UTF-16轉換為UTF-8。

您可以通過Execute Process Task使用類似的命令:

dos2unix filename

(2)數據流任務

您可以創建一個數據流任務,以將平面文件源中的數據傳輸到新的平面文件目標中,這兩個平面文件連接mAnager具有相同的結構,但行定界符屬性(Source中的{CR}{LF} {LF} ,Destination中的{LF}

(3)使用腳本任務-StreamReader / Writer

您可以使用具有類似代碼的腳本任務:

string data = null;
//Open and read the file
using (StreamReader srFileName = new StreamReader(FileName))
    {
        data = srFileName.ReadToEnd();
        data = data.Replace("\r\n","\n");
    }

using (StreamWriter swFileName = new StreamWriter(FileName))
    {
        swFileName.Write(data);
    }

(4)使用解壓縮-a提取

從以下解壓縮文檔中

-一種

轉換文本文件。 通常,所有文件的提取都與它們存儲時完全相同(作為“二進制”文件)。 -a選項使被zip識別為文本文件的文件(在zipinfo列表中帶有't'標簽而不是'b'的文件)被自動提取,從而轉換行尾,文件結尾字符和字符根據需要進行設置。 (例如,Unix文件使用換行符(LF)來表示行尾(EOL),並且沒有文件結尾(EOF)標記; Macintosh機使用回車符(CR)來表示EOL;大多數PC操作系統使用CR + LF用於EOL,control-Z用於EOF。此外,IBM大型機和密歇根終端系統使用EBCDIC而不是更常見的ASCII字符集,而NT支持Unicode。完善; 一些“文本”文件實際上可能是二進制文件,反之亦然。 因此,對於使用-a選項提取的每個文件,unzip將打印“ [text]”或“ [binary]”作為對其進行目測的檢查。 -aa選項強制所有文件提取為文本,無論假定的文件類型如何。 在VMS上,另請參閱-S。

因此,您可以使用以下命令來提取具有變化的行尾的文本文件:

unzip -a filename

歸功於@jww評論


其他有用的鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM