Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Построчное получение содержимого файла

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
createl
Отправлено: 10 Февраля, 2013 - 23:03:38
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




Может кто подскажет чего? Нужно файлик закодированный UCS-2LE перекодировать в windows кодировку. Все в принципе ясно как, но fgets не работает (видимо файл ей не воспринимается как текстовый, и она там не видит строк) может еще есть какие то варианты читать его по частям?
 
 Top
DeepVarvar Супермодератор
Отправлено: 10 Февраля, 2013 - 23:19:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




 
 Top
createl
Отправлено: 11 Февраля, 2013 - 23:24:01
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




DeepVarvar пишет:

Все оказалось проще. Для виндовса существует различие бинарный/текстовый файл, и кодированный в UCS-2 по видимому первый вариант. Решается просто, открывается файл fopen () с флагом rb вместо a и fgets() корректно читает построчно.

Но радость моя была преждевременна. Почему то отказалась работать iconv(), хотя в ходе экспериментов все норм было
PHP:
скопировать код в буфер обмена
  1. $new_text = iconv ("UCS-2LE", "ASCII", $bytes);

Но может это и к лучшем, поскольку я полез глубже, и о чудо! - начал понимать, что написанно в hex редакторе Ха-ха (за долгие годы учебы, попытки педагогов пробиться сквозь мое деревянное сознание, и объяснить основы, не увенчались успехом, а полез сам, и как дрелью...)
В общем родил своего франкенштейна. С учетом того, что закодирована латиница, по непонятным причинам кодированная в UCS, просто убираем лишний нулевой байт (если он будет не нулевой, то будет крякозябра, хотя можно и ее убрать).
PHP:
скопировать код в буфер обмена
  1. $id_reg = fopen ('ready.txt', 'w');
  2. $id_c = fopen ('wordlist_by_Sheez.001', 'rb');
  3.  
  4. $count = 0;
  5.  
  6. $no_decoded_simbol = 0;
  7. while (($bytes = fgets ($id_c, 1024)) !== false)
  8. {
  9.     $str_decoded = '';
  10.     for ($cx = 0, $sl = 1; ($part = substr ($bytes, $cx)) !== false; $cx++, $sl++)
  11.     {
  12.         if (ord ($part) == 0) continue;
  13.         else $str_decoded .= substr ($part, 0, 1);
  14.         if ($sl % 2);
  15.     }
  16.     fwrite ($id_reg, $str_decoded);
  17. }
  18. fclose ($id_reg);
  19. fclose ($id_c);
  20.  
  21.  
  22. echo "Не декодированно символов " . $no_decoded_simbol;
  23.  
  24.  
  25.  


Все работает, на выходе рабочий файл. Но опять засада. Расчет времени, которое будет затрачено на нужный мне файл (он большой по размеру) больше двух суток. Это уже никуда не годится. На большее неспособен мой пенькокор 2. Хотя и i7, которым мне и не сниться, думается, не больше трети по времени сэкономит, так как все в один поток. Да и пых, наверное, загнется раньше. Вообщем мучаюсь с этим файлом уже кучу времени, и фантазия на исходе...
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Февраля, 2013 - 23:30:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




А скока весит файл?
Скиньте в личку, щас переконверчу и расскажу как делал.
(Добавление)
CODE (bash):
скопировать код в буфер обмена
  1. iconv -c -f UCS-2LE -t CP1251 -o ./out ./in
 
 Top
createl
Отправлено: 11 Февраля, 2013 - 23:50:18
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




45 гб
(Добавление)
Сегодня уже не жу жу. завтра попробую предложенный вариант
 
 Top
createl
Отправлено: 12 Февраля, 2013 - 10:38:40
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




Спасибо DeepVarvar. Всегда у тебя имеется, что ответить по делу. Прикрутил к винде iconv - конвертит. Скрипт мой барахло. Конва бысрее работает. Плюс, на 30 мб куске, в ходе проб, скрипт нашел нечетный, ненулевой байт (всего 15 - а сколько их на 45 г), а значит перекодировать правильно моей логикой не получится. Конва, без //ignore не стопарнулась, значит эти символы ей подвластны. Поставил на конвертацию. Ориентировочное время 6 часов.

P.S. Вообще сколько проблем из за этих кодировок. Все было бы проще, если бы болтали на одном языке. Представляю как все ужасно у китайцев. У них ведь буква, по сути, является словом. Представляю как выглядит их азбука - что то на вроде нашего толкового словаря...
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB