Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: убрать средствами PHP нежелательные символы из текстового файла.
 
 автор: elenaki   (16.09.2004 в 13:45)
 
 

FoxPro при выводе данных в текстовый файл периодически, примерно через 60 строк, вставляет
два неизвестных системе символа (квадратики) и не переводит строку, а пишет след. запись на
той же. потом нормально выводит след. группу записей и опять эту фигню. у меня из-за нее не
грузится файл в базу. скрипт делит файл на строки, строки на поля, а если перевода строки нет,
воспринимает как одну строку и выдает ошибку...
как заменить эти символы на "перевод строки" , если я даже не знаю, что это за символы? подозреваю,
что это перевод страницы. но как от него избавиться?

   
 
 автор: cheops   (16.09.2004 в 16:30)   письмо автору
 
   для: elenaki   (16.09.2004 в 13:45)
 

Можно было бы шикарно их заменить на символ перевода строки str_replace(), подсмотрев их значения в каком-нибудь hex-редакторе или воспользовавшись функцией ord(), которая возвращает ASCII код символа, определив коды этих символов потом можно будет их легко заменить, выполнив обратное преобразование:
<?php
  
// $fst - ASCII код первого символа
  // $snd - ASCII код второго символа
  
$test str_replace(chr($fst).chr($snd), "\r\n"$test);
?>


http://www.softtime.ru/dic/id_dic=37&id_group=1

   
 
 автор: elenaki   (16.09.2004 в 17:59)
 
   для: cheops   (16.09.2004 в 16:30)
 

дело в том, что эти непонятные символы совсем не первые в строке. :(
сделала их первыми (удалив все, что перед ними), получила код - 46.
это точка. если я эрегом удалю все 46-е ASCII, у меня пропадут все точки?
сейчас уже некогда, надо домой идти. я подумаю об этом завтра...

   
 
 автор: cheops   (16.09.2004 в 23:21)   письмо автору
 
   для: elenaki   (16.09.2004 в 17:59)
 

Хм... а второй символ какой? Можно вообще не выяснять их природу - попытаться их вырезать, сохранить в переменной или файле, а потом заменять эту последовательность на "\r\n".

PS Было бы неплохо если бы вы прекрепили кусок файла с этими символами обрамлённых парой слов, можно было бы повозиться с ними всем вместе.

   
 
 автор: elenaki   (17.09.2004 в 12:35)
 
   для: cheops   (16.09.2004 в 23:21)
 

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

   
 
 автор: elenaki   (17.09.2004 в 12:39)
 
   для: elenaki   (17.09.2004 в 12:35)
 

второй непонятный символ - это перевод строки. почему-то если открывать data1.txt в winCmD или
в блокноте, он показывает два квадратика и не переводит строку, а в эксплорере - один квадратик и
переводит строку

   
 
 автор: cheops   (17.09.2004 в 13:40)   письмо автору
 
   для: elenaki   (17.09.2004 в 12:39)
 

Хм... мне ord() говорит, что это символ 12 - "Новая страница", попробуйте заменить этот символ на манер:
<?php 
  
// имя файла
  
$filename "test.txt";
  
// открываем файл 
  
$file fopen($filename"r"); 
  
// читаем его содержимое в буффер 
  
$buffer fread($filefilesize($filename)); 
  
// закрываем файл 
  
fclose($file); 
  
$buffer str_replace(chr(12),"\r",$buffer);
  
// открываем файл 
  
$file fopen($filename"w"); 
  
// записываем в него новое содержимое
  
fwrite($file$buffer); 
  
// закрываем файл 
  
fclose($file); 
?>

   
 
 автор: cheops   (17.09.2004 в 13:46)   письмо автору
 
   для: cheops   (17.09.2004 в 13:40)
 

Правда в результате остаются пустые строки, но с ними работать гораздо приятнее. Уже не составит труда избавиться от лишних строк заменой двух подряд идущих переводов строк одним.

PS Только следует внимательно следить за тем, как формирется файл - в стиле Windows (перевод строки по \r\n) или в стиле UNIX (перевод строки по \n).

   
 
 автор: cheops   (17.09.2004 в 13:53)   письмо автору
 
   для: elenaki   (17.09.2004 в 12:39)
 

Тогда становится понятным, почему нервничают блокнот и winCmD - они переводят строки, только при наличии подряд идущих символов возврата коретки \r (13) и перевода строки \n (10), поэтому когда они встречают подряд идущие символы новой страницы (12) и первода строки (10) - они выводят два два квадратика (два не читаемых символа). Эксплорер, судя по всему нормально обрабатывает одиночный символ перевода строки \n (10) и выводит только один квадратик - новая страница...

PS Возиться с невидимыми символами всегда очень интересно, особенно, если задача чужая и её не надо сдавать к сроку :)))

   
 
 автор: elenaki   (17.09.2004 в 16:27)
 
   для: cheops   (17.09.2004 в 13:53)
 

спасибо! на локалке работает. а на сервере нет. все из-за того, что запрещена запись в файл. нельзя ли
как-то обойтись без записи? у меня теперь два текстовых файла должны передавать свою инфу в базу.
я их открываю поочереди, читаю, разбиваю на строки и заношу в базу. но это, если замену не делать. с
заменой не получается. надо записывать промежуточный результат, а мне это не позволяют.
на сервере, где такая запись разрешена, работает. пытаюсь грузить файл с клиентского сервера, где нет
возможности изменить CHMOD на тот, где есть, но ничего не получается, хотя написано, что fopen() может
открывать удаленные файлы и по FTP и по HTTP.

   
 
 автор: LimP   (17.09.2004 в 16:36)   письмо автору
 
   для: elenaki   (17.09.2004 в 16:27)
 

значит меняй хостинг...

   
 
 автор: cheops   (17.09.2004 в 21:35)   письмо автору
 
   для: elenaki   (17.09.2004 в 16:27)
 

Ну... необязательно файл преобразовывать, перед разбивкой можно прочитать информацию в буффер (текстовую строку), как это сделано двумя постами выше - заменить в ней символы и потом подвергать разбиению. В этом случае записывать в файл даже вредно - чего их 100 раз открывать, закрывать - это после сетевого обмена самая медленная операция на сервере.

   
 
 автор: elenaki   (20.09.2004 в 11:37)
 
   для: cheops   (17.09.2004 в 21:35)
 

я сделала! обошлась без записывания данных в файл. переменную $buffer разбила на строки,
потом эти строки преобразаовала в запрос и запихнула все в базу. всем спасибо!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования