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
Форумы портала PHP.SU :: Версия для печати :: Построчное получение содержимого файла
Форумы портала PHP.SU » » Вопросы новичков » Построчное получение содержимого файла

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

1. createl - 10 Февраля, 2013 - 23:03:38 - перейти к сообщению
Может кто подскажет чего? Нужно файлик закодированный UCS-2LE перекодировать в windows кодировку. Все в принципе ясно как, но fgets не работает (видимо файл ей не воспринимается как текстовый, и она там не видит строк) может еще есть какие то варианты читать его по частям?
2. DeepVarvar - 10 Февраля, 2013 - 23:19:07 - перейти к сообщению
3. createl - 11 Февраля, 2013 - 23:24:01 - перейти к сообщению
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, которым мне и не сниться, думается, не больше трети по времени сэкономит, так как все в один поток. Да и пых, наверное, загнется раньше. Вообщем мучаюсь с этим файлом уже кучу времени, и фантазия на исходе...
4. DeepVarvar - 11 Февраля, 2013 - 23:30:41 - перейти к сообщению
А скока весит файл?
Скиньте в личку, щас переконверчу и расскажу как делал.
(Добавление)
CODE (bash):
скопировать код в буфер обмена
  1. iconv -c -f UCS-2LE -t CP1251 -o ./out ./in
5. createl - 11 Февраля, 2013 - 23:50:18 - перейти к сообщению
45 гб
(Добавление)
Сегодня уже не жу жу. завтра попробую предложенный вариант
6. createl - 12 Февраля, 2013 - 10:38:40 - перейти к сообщению
Спасибо DeepVarvar. Всегда у тебя имеется, что ответить по делу. Прикрутил к винде iconv - конвертит. Скрипт мой барахло. Конва бысрее работает. Плюс, на 30 мб куске, в ходе проб, скрипт нашел нечетный, ненулевой байт (всего 15 - а сколько их на 45 г), а значит перекодировать правильно моей логикой не получится. Конва, без //ignore не стопарнулась, значит эти символы ей подвластны. Поставил на конвертацию. Ориентировочное время 6 часов.

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

 

Powered by ExBB FM 1.0 RC1