передача файлов из Windows в Linux - PullRequest
0 голосов
/ 04 февраля 2019

Я экспортирую данные в CSV-файл, используя ssis.В моем пакете ssis я сжимаю файл в формате zip и загружаю его на сервер Linux с помощью sftp.Проблема в том, что в целевой файловой системе файлы csv содержат символ ^ M, который приходит из системы dos.

Я нашел три решения.

  • Сначала я мог установить режим передачи sftp на ascii, а не архивировать файл (позже я узнал, что это поддерживается только ftp).Учитывая, что мой разархивированный файл> 3 ГБ, что неэффективно, загрузка займет несколько лет.

  • Во-вторых, после передачи я мог разархивировать файл и преобразовать его с помощью утилиты dos2unix, но опять же dos2unix не установлен, и я не авторизован для его установки в целевой системе.

  • Наконец, я мог бы использовать редактор Unix, такой как sed, для удаления ^ M с конца строк.Мой файл состоит из более чем 4 миллионов строк, и это снова займет много времени.

Q: Есть ли способ предварительно отформатировать мой файл в ASCII, используя ssis,тогда почтовый индекс и передача?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

При поиске по этой проблеме я обнаружил очень полезные ссылки, в которых были описаны причина и возможные решения этой проблемы:

Причина

Файл был передан между системами разных типов с различными соглашениями новой строки.Например, текстовые редакторы на базе Windows будут иметь специальный символ возврата каретки (CR + LF) в конце строк для обозначения возврата строки или новой строки, которые будут неправильно отображаться в Linux (^ M).Это может быть трудно обнаружить, так как некоторые приложения или программы могут правильно обрабатывать иностранные символы новой строки, тогда как другие этого не делают.Таким образом, некоторые службы могут давать сбой или не отвечать правильно.Часто это происходит потому, что файл создается или, возможно, даже редактируется на компьютере с Microsoft Windows, а затем загружается или переносится на сервер Linux.Обычно это происходит, когда файл передается из MS-DOS (или MS-Windows) без ASCII или текстового режима.


Возможные разрешения

(1) Использование команды dos2unix

dos2unix включает в себя утилиты для преобразования текстовых файлов с переносами строк DOS или MAC в разрывы строк Unix и наоборот.Он также включает преобразование UTF-16 в UTF-8.

Вы можете использовать аналогичную команду с помощью Execute Process Task:

dos2unix filename

(2)Задача «Поток данных»

Вы можете создать задачу «Поток данных», которая переносит данные из источника плоских файлов в новое место назначения плоских файлов, если оба подключения к плоским файлам mAnager имеют одинаковую структуру, кроме свойства «Разделитель строк» ​​ ({CR}{LF} в источнике, {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) Извлечь с помощью unzip -a

Из следующей распаковать документацию :

-a

конвертировать текстовые файлы.Обычно все файлы извлекаются именно так, как они хранятся (как «бинарные» файлы).Опция -a позволяет автоматически извлекать файлы, идентифицированные zip как текстовые файлы (файлы с меткой 't' в списках zipinfo, а не 'b'), конвертируя окончания строк, символы конца файла и символыустановить себя по необходимости.(Например, файлы Unix используют перевод строки (LF) для конца строки (EOL) и не имеют маркера конца файла (EOF); ​​Macintoshes используют возврат каретки (CR) для EOL; и большинство операционных систем ПК используютCR + LF для EOL и control-Z для EOF. Кроме того, мэйнфреймы IBM и терминальная система Мичигана используют EBCDIC, а не более распространенный набор символов ASCII, а NT поддерживает Unicode.) Обратите внимание, что zip-идентификация текстовых файлов отнюдь неидеально;некоторые текстовые файлы могут быть двоичными и наоборот.поэтому unzip печатает '' [text] '' или '' [binary] '' в качестве визуальной проверки для каждого файла, который он извлекает при использовании опции -a.Опция -aa заставляет все файлы извлекаться как текст, независимо от предполагаемого типа файла.В VMS см. Также -S.

Таким образом, вы можете использовать следующую команду для извлечения текстовых файлов с изменением окончаний строк:

unzip -a filename

Кредит @ jww комментарий


Другие полезные ссылки

0 голосов
/ 04 февраля 2019

Я не пробовал, но я думал, что вы можете выполнить преобразование CR + LF -> LF только при выводе в файл csv.Я посмотрел в этой ссылке здесь

Прокрутите вниз до раздела "Разделитель строк заголовка".Похоже, что если вы выберете {LF} в качестве разделителя строк, ваш результирующий файл .zip будет правильно отображаться в вашем окне linux.

Кстати, возможно, вы знаете, но я должен упомянуть, что ^ M - это представлениеCR в linux / unix box.

BTW2, в большинстве случаев ^ M в linux не проблема, просто какая-то раздражающая вещь.

Я надеюсь, что смогу помочь!

...