Excel сохраняет файлы с разделителями табуляции без новой строки (UNIX/Mac os X)
Это обычная проблема, которая у меня есть, и мое решение немного нахально. Поэтому я ищу быстрое исправление и объяснение проблемы.
Проблема заключается в том, что когда я решаю сохранить таблицу в excel (mac 2011) в виде файла с разделителями табуляции, кажется, что это прекрасно. Пока я не попытаюсь проанализировать файл строки за строкой, используя Perl. По какой-то причине он разбивает весь документ в одной строке.
Мое грубое решение - открыть файл в веб-браузере и скопировать и вставить информацию в файл с разделителями табуляции в TextEdit (я никогда не использую формат форматированного текста). Я попытался представить новую строку в конце файла перед выполнением этого исправления, и это не решит проблему.
Что здесь происходит? Было бы полезно получить объяснение.
~ Спасибо! ~
Ответы
Ответ 1
Проблема - это коды символов, которые определяют новые строки в разных системах. Системы Windows обычно используют системы CarriageReturn + LineFeed (CRLF) и * NIX, которые используют только LineFeed (LF).
Эти символы могут быть представлены в RegEx как \r\n или \n (соответственно).
Иногда, чтобы хэш через текстовый файл, вы должны разбирать символы новой строки. Попробуйте это для DOS-UNIX в perl:
perl -pi -e 's/\r\n/\n/g' input.file
или для UNIX-DOS с использованием sed:
$ sed 's/$'"/`echo \\\r`/" input.txt > output.txt
или для DOS-UNIX с использованием sed:
$ sed 's/^M$//' input.txt > output.txt
Ответ 2
Нашел довольно простое решение. Скопируйте данные из Excel в буфер обмена, вставьте их в электронную таблицу google. Загрузите файл электронной таблицы google как "значения, разделенные вкладками .tsv". Это обострило проблему, и у вас есть разделители вкладок с концом строки для каждой строки.
Ответ 3
Еще одно решение...
- для файла с разделителями табуляции, сохраните документ как тип файла
Windows Formatted Text (.txt)
- для файла с разделителями-запятыми, сохраните документ в виде файла `Windows Comma Separated (.csv) '
Ответ 4
Perl имеет полезный шаблон регулярного выражения \R
, который будет соответствовать любой общей строке. Он фактически соответствует любому вертикальному пробелу - то же, что и \v
- или комбинации CR LF, поэтому он совпадает с \r\n|\v
Это полезно здесь, потому что вы можете скопировать весь свой файл в один скаляр, а затем split /\R/
, который предоставит вам список файлов, уже chomp
ed (если вы хотите сохранить терминаторы строк, вы можете split /\R\K/
вместо
Другим вариантом является PerlIO::eol
. Он обеспечивает новый уровень ввода-вывода Perl, который будет нормализовать окончания строк независимо от того, что содержимое файла
После того, как вы загрузили модуль с помощью use PerlIO::eol
, вы можете использовать его в инструкции open
open my $fh, '<:eol(LF)', 'myfile.tsv' or die $!;
или вы можете использовать open
pragma, чтобы установить его как уровень по умолчанию для всех дескрипторов входных файлов
use open IN => ':raw:eol(LF)';
который отлично работает с входным файлом с любой платформы