从Windows文件传输到Linux

问题描述 投票:1回答:2

我使用SSIS在CSV文件导出数据。在我的SSIS包我压缩ZIP格式的文件,并使用SFTP上传它在Linux服务器上。问题是,在目标文件系统中,CSV文件,包括来自DOS系统^ M字。

我发现了三种解决方案。

  • 首先,我可以设置SFTP传输模式为ASCII模式,而不是压缩文件(我后来发现,这只是通过FTP支持)。考虑到我的解压文件是>的3Gb就是效率不高,上传将采取年龄。
  • 其次,一旦转移,我可以解压缩文件,并使用DOS2UNIX的工具将其转换,但同样DOS2UNIX的未安装和我没有被授权将其安装到目标系统。
  • 最后,我可以使用UNIX编辑器,像sed从线路末端除去^ M。我的文件包括了超过400万线,而这将再次采取青睐。

问:是否有任何方式使用SSIS,然后压缩并传输到预格式化我的ASCII文件?

linux windows ssis ftp sftp
2个回答
1
投票

虽然在这个问题上搜索,我发现一个非常有用的链接被他们所描述的原因,这个问题可能的解决方案:

Cause

文件已经不同类型用不同的换行符约定的系统之间传递。例如,基于Windows的文本编辑器将在线路的端部的特殊回车符(CR + LF)来表示一个行回或换行,这将不正确地在Linux中(^ M)被显示。这可能是很难被发现,因为一些应用或程序可妥善处理外国换行符而有的则没有。因此,一些服务可能会崩溃或者无法正确响应。很多时候,这是因为文件被创建或者甚至一个Microsoft Windows计算机上编辑,然后上传或转移到Linux服务器上。这通常当一个文件被从MS-DOS(或MS-Windows),而不ASCII或文本模式转移发生。


Possible resolutions

(1)使用DOS2UNIX的命令

DOS2UNIX的包括公用事业文本文件转换与DOS或MAC换行符为Unix换行,反之亦然。它还包括UTF-16转化成UTF-8。

您可以通过Execute Process Task使用类似的命令:

dos2unix filename

(2)数据流任务

您可以创建一个从平面文件源数据转移到一个新的平面文件目标是数据流任务都平面文件连接管理器除了行分隔符属性相同的结构({CR}{LF}的来源,{LF}目的地)

(3)使用脚本任务 - 的StreamReader /写

您可以使用脚本任务有类似的代码:

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

从下面unzip documentation

-一种

转换的文本文件。通常所有的文件解压缩,正是因为他们被存储(如“”二进制“”文件)。 -a选项使得由压缩为文本文件(具有在zipinfo上市的“T”的标签,而不是“B”)来标识文件,这样被自动提取,转换行结束,结束文件中的字符和字符设置本身是必要的。 (例如,UNIX文件使用为最终的线(EOL换行符(LFS)),并具有无档案结尾(EOF)标记;对于EOLS麦金塔使用回车(CRS);并且最PC操作系统使用CR + LF为EOLS和控制-Z的EOF。此外,IBM大型机和密歇根终端系统使用EBCDIC而不是更常见的ASCII字符集,而NT支持Unicode)。注意的文本文件,ZIP的身份绝不完善;一些'文字“”文件实际上可能是二进制的,反之亦然。因此解压缩打印“” [文本]“”或“” [二进制]“”作为目视检查对每个文件使用-a选项时提取。该-AA选项强制所有文件中提取文本,无论是所谓的文件类型。在VMS,又见-S。

所以,你可以使用下面的命令来提取与改变行结尾的文本文件:

unzip -a filename

感谢@jww评论


Other Useful links


1
投票

我没有尝试,但我认为你可以做一个CR + LF - outputing到CSV文件时> LF转换而已。我看着在这个环节here

向下滚动到部分“标题行分隔符”。看来,如果你选择{LF}作为行分隔符,你得到的.zip文件将正确Linux机器显示。

顺便说一句,也许你知道,但我不得不提到^ M是在Linux / Unix下的CR的表示。

BTW2,在大多数情况下,在Linux中^ M是没有问题的,只是一些烦人的事情。

我希望我能帮助!

© www.soinside.com 2019 - 2024. All rights reserved.