Я читаю текстовый файл через CGI в perl и замечаю, что когда файл сохраняется в textEdit в маке, разделитель строк распознается, но когда я загружаю CSV, который экспортируется прямо из excel, это не так. Я предполагаю, что это проблема \ n vs. \ r, но мне показалось, что я не знаю, как указать, что я хотел бы использовать токен терминатора линии, если бы я не хотел, чтобы он искал по умолчанию.есть ли способ обозначить разделитель токенов в файловом считывателе Perl?
ответ
Да. Вы захотите переписать значение $/
. От perlvar
$/
Входной разделитель записей, символ новой строки по умолчанию. Это влияет на идею Перла о том, что такое «линия». Работает как переменная RS awk, включая обработку пустых строк в качестве терминатора, если задана нулевая строка. (Пустая строка не может содержать пробелов или вкладок.) Вы можете установить ее в многосимвольную строку для соответствия терминатору с несколькими символами или undef для чтения в конце файла. Установка его в «\ n \ n» означает нечто немного отличное от установки на «», если файл содержит последовательные пустые строки. Установка в «" будет обрабатывать две или более последовательных пустых строк как одну пустую строку. Установка в «\ n \ n» будет вслепую предполагать, что следующий входной символ относится к следующему абзацу, даже если это новая строка. (Мнемоника:/разграничивает границы строки при цитировании поэзии.)
local $/; # enable "slurp" mode local $_ = <FH>; # whole file now here s/\n[ \t]+/ /g;
Помните: значение $/является строка, а не регулярное выражение. awk должно быть лучше для чего-то. :-)
Установка $/для ссылки на целое число, скаляр, содержащий целое число, или скаляр, преобразуемый в целое число, будет пытаться читать записи вместо строк, причем максимальный размер записи является целым числом. Таким образом:
local $/ = \32768; # or \"32768", or \$var_containing_32768 open my $fh, "<", $myfile or die $!; local $_ = <$fh>;
будет читать запись не более 32768 байт из ФАЙЛА. Если вы не читаете из файла, ориентированного на запись (или у вашей ОС нет файлов, ориентированных на запись), тогда вы, вероятно, получите полный кусок данных при каждом чтении. Если запись больше размера записи, которую вы установили, вы снова получите запись. Попытка установить размер записи до нуля или меньше приведет к чтению в целом (остальной части) файла.
На VMS записи записываются с эквивалентом sysread, поэтому лучше не смешивать записи и записи без записи в одном файле. (Это вряд ли будет проблемой, потому что любой файл, который вы хотите прочитать в режиме записи, вероятно, непригоден в линейном режиме.) Системы, отличные от VMS, выполняют обычный ввод-вывод, поэтому безопасно смешивать записи и записи без записи файла.
См. Также «Новые строки» в perlport. Также см. $ ..
спасибо! Я понимаю, что это глупый вопрос, но спросите, на всякий случай ... настройка ограничена только для этого скрипта, правильно? Это не повлияет на поведение других скриптов? –
@ Dr.Dredel => ключевое слово 'local' ограничивает масштаб ваших изменений глобальным. Правила определения местоположения для 'local' такие же, как' my', поэтому локализация завершится в конце текущего блока. Очень важно отметить, что любые переменные, которые локализованы, будут иметь новое значение в коде, вызываемом из области локализации. Пока ваша локализация небольшая 'my $ file = do {local $ /; <$fh>} 'тогда вам не о чем беспокоиться. И все изменения, конечно, теряются, когда скрипт заканчивается, даже если вы не использовали локальный. –
переменная имеет несколько названий:
$/
$RS
$INPUT_RECORD_SEPARATOR
Для более длинных имен, вам необходимо:
use English;
Не забудьте тщательно локализовать:
{
local($/) = "\r\n";
...code to read...
}
Если вы читаете в файл с терминаторами линии CRLF, вы можете открыть его с помощью CRLF дисциплины, или установить binmode ручки сделать автоматический перевод.
open my $fh, '<:crlf', 'the_csv_file.csv' or die "Oh noes $!";
Это будет прозрачно преобразовать \r\n
последовательности в \n
последовательности.
Вы также можете применить этот перевод к существующей ручке, выполнив:
binmode($fh, ':crlf');
:crlf
режима обычно по умолчанию в среде Win32 Perl и работает очень хорошо на практике.
- 1. C++ Функция набора номера из другого класса в файловом считывателе
- 2. Есть ли способ обозначить кнопку Go в iPhone Safari?
- 3. Есть ли способ сделать разделитель, как разделитель UITableView?
- 4. Есть ли способ получить количество токенов в правиле парсера ANTLR4?
- 5. Есть ли счетчик токенов C#?
- 6. Есть ли способ изменить разделитель после linenumber в vim?
- 7. Есть ли способ использования. разделитель в дополнительных свойствах градации
- 8. Разделитель параметров в Perl?
- 9. Есть ли способ загрузить профиль внутри Perl?
- 10. Есть ли способ сделать ANTLR4 использовать перечисления для генерируемых токенов?
- 11. Есть ли способ отслеживать задержку транзакционной репликации без использования токенов?
- 12. API Box.net Есть ли способ продлить срок действия токенов доступа?
- 13. Есть ли способ объединить два токена из списка токенов?
- 14. Есть ли способ расшифровать скрипт perl?
- 15. Perl - как получить значения токенов
- 16. Есть ли способ в Perl проверить, защищен ли пароль?
- 17. Любой способ обозначить выходы в аргументах функции?
- 18. Определите, есть ли разделитель CSV ";" или ","
- 19. Есть ли разделитель для options_for_select в рельсах?
- 20. Есть ли разделитель по умолчанию в OpenMP?
- 21. Есть ли эквивалент валидации токенов Struts весной
- 22. Есть ли способ прочитать файлы .mat в MATLAB в Perl?
- 23. В Perl: Есть ли способ узнать имя переменной в списке?
- 24. Javascript: обнаружение, если есть изображение в считывателе файлов
- 25. Есть ли способ переписать URL-адрес, чтобы перейти к файлу, хранящемуся в файловом поле узла
- 26. есть ли способ в Perl, чтобы определить, использует ли perl-процесс в окнах определенный файл.
- 27. Обозначить строку в поиске elastics?
- 28. Есть ли портативный Perl?
- 29. Есть ли способ перегрузить оператор привязки regex `= ~` в Perl?
- 30. Есть ли способ узнать методы экземпляра неизвестного класса в Perl
Обратите внимание: если вы читаете CSV, вы обязательно захотите использовать модуль, например [Text :: CSV] (http://search.cpan.org/perldoc?Text::CSV), с помощью ' Вместо этого установлен текст :: CSV_XS'. Не пытайтесь изобретать колесо чтения CSV ... в первый раз это достаточно сложно! –