#php #windows #linux #macos #line-endings
#php #Windows #linux #macos #окончания строк
Вопрос:
Когда я сохраняю файл TSV в Windows из Excel, в нем используется окончание строки r или 015 (восьмеричное), которое отображается в vi как ^M.
Когда я сохраняю файл TSV на Mac из Excel, в нем используется окончание строки r n или 15 012 (восьмеричное), которое отображается в vi как ^M.
Как мне обработать изменение окончаний строк в обоих файлах без добавления дополнительных пустых строк, но при этом сохраняя совместимые с Linux окончания строк?
В настоящее время я использую exec () в PHP для запуска следующего:
Если я использую:
cat {FILE} | tr -d "15" > {NEW_FILE}
или
cat {FILE} | tr -d "r" > {NEW_FILE}
Работает для файлов Windows, но файлы Mac терпят неудачу. (удаляет все окончания строк)
Если я использую:
cat {FILE} | tr "15" "12" > {NEW_FILE}
или
cat {FILE} | tr "r" "n" > {NEW_FILE}
Работает для файлов Mac, но файлы Windows терпят неудачу. (создает пустые строки)
Есть идеи, как справиться с ними в рамках одной процедуры?
Комментарии:
1. Пробовал sed ?
sed -e 's/$/r/' unix-format.txt > win-format.txt
2. Это будет работать для Windows, но не работает для Mac. Мне нужно решение, которое будет работать для любого файла.
3. Что ж, вы можете попробовать скрипт, который считывает первую строку 1 символ и посмотреть, заканчивается ли она на r или r n, а затем обработать соответствующим образом в вашем собственном «коде конвертера». Таким образом, вы можете придерживаться чистого PHP без сторонних зависимостей.
Ответ №1:
Я думаю, что нашел элегантное решение этой проблемы. В моем PHP-скрипте я создал следующее:
$results = exec("cd $directory; grep -Pl $'rn' $filename");
if($results == $filename) {
// Windows File (default)
exec("cd $directory; cat $filename | tr -d '15' > $tmpfile; mv $tmpfile $filename");
} else {
// MAC File
exec("cd $directory; cat $filename | tr 'r' 'n' > $tmpfile; mv $tmpfile $filename");
}
Я открыт для улучшений, если у кого-то они есть.
Ответ №2:
dos2unix для файлов Windows и mac2unix для файлов mac.
Комментарии:
1. Еще раз… У меня нет доступа к этим утилитам на сервере. Они не установлены и не могут быть.