Парсер текстовых файлов

Discussion in 'Криптография, расшифровка хешей' started by AdvLamer, 16 Apr 2007.

  1. AdvLamer

    AdvLamer Elder - Старейшина

    Joined:
    1 Jan 2006
    Messages:
    228
    Likes Received:
    205
    Reputations:
    112
    Парсер текстовых файлов

    В помошь тем, кто хочет пропарсить свой винт и/или создать небольшой словарь :)
    (при создании нового словаря около метра из него было собрано из несколько десятков кило "текстовых" файлов из папки WINNT, my docs etc)
    Опишу, как это делал я.

    Берем Тотал командер
    Идем в корень диска, жмем Вид->Фильтр
    Выбираем например такие расширения *.txt *.htm *.html, то есть файлы, в которых может присутствовать русский текст в обычной кодировке.

    Отдельно можно собрать все *.chm
    и декомпилирость
    Для этого выбираем в тотале Файлы->Групповое перименование
    Инкрементно переименовываем, далее по образцу
    hh.exe -decompile result 1.chm
    Делаем с помошью, например, екселя, пакетный файл, который автоматически декомпилит все файлы chm в папку result

    Декомпилер лежит тут c:\WINNT\hh.exe

    После того, как сложили все "текстовые файлы" в одну папку, групповое переименование в 1.txt 2.txt 3.txt и так далее
    Затем берем прожку http://advlamer.narod.ru/dprogs/glue_files.rar
    И соединяем все это файлы в один.

    И вот у нас есть боольшой ака текстовый файл с русскими словами, теперь нужно выдрать из него эти самые слова

    Можно делать на пхп (если у кого нет компилятора СИ)
    Вот код на пхп

    PHP:
    <?php
    function tolow($str)
    {
        
    $ret=$str;
        for (
    $i=0;$i<strlen($str);$i++)
            switch (
    $str[$i])
            {
                case 
    'Ё'ret[i]='ё'; break;
                case 
    'Й'$ret[$i]='й'; break;
                case 
    'Ц'$ret[$i]='ц'; break;
                case 
    'У'$ret[$i]='у'; break;
                case 
    'К'$ret[$i]='к'; break;
                case 
    'Е'$ret[$i]='е'; break;
                case 
    'Н'$ret[$i]='н'; break;
                case 
    'Г'$ret[$i]='г'; break;
                case 
    'Ш'$ret[$i]='ш'; break;
                case 
    'Щ'$ret[$i]='щ'; break;
                case 
    'З'$ret[$i]='з'; break;
                case 
    'Х'$ret[$i]='х'; break;
                case 
    'Ъ'$ret[$i]='ъ'; break;
                case 
    'Ф'$ret[$i]='ф'; break;
                case 
    'Ы'$ret[$i]='ы'; break;
                case 
    'В'$ret[$i]='в'; break;
                case 
    'А'$ret[$i]='а'; break;
                case 
    'П'$ret[$i]='п'; break;
                case 
    'Р'$ret[$i]='р'; break;
                case 
    'О'$ret[$i]='о'; break;
                case 
    'Л'$ret[$i]='л'; break;
                case 
    'Д'$ret[$i]='д'; break;
                case 
    'Ж'$ret[$i]='ж'; break;
                case 
    'Э'$ret[$i]='э'; break;
                case 
    'Я'$ret[$i]='я'; break;
                case 
    'Ч'$ret[$i]='ч'; break;
                case 
    'С'$ret[$i]='с'; break;
                case 
    'М'$ret[$i]='м'; break;
                case 
    'И'$ret[$i]='и'; break;
                case 
    'Т'$ret[$i]='т'; break;
                case 
    'Ь'$ret[$i]='ь'; break;
                case 
    'Б'$ret[$i]='б'; break;
                case 
    'Ю'$ret[$i]='ю'; break;        
                default: 
    $ret[$i]=$str[$i];
            }
        
        return 
    $ret;    
    }

    $in=fopen("in.txt","r");
    $out=fopen("out_tmp.txt","w");
    $norus=0;
    $n=0;
    while (!
    feof($in))
    {
        
    $n++;
        
    $c=fgetc($in);
        if (((
    $c>='а')&&($c<='я'))||(($c>='А')&&($c<='Я')))
        {
            if ((
    $norus==1)&&($n!=1))
                
    fwrite($out,"\n");
            
    fwrite($out,$c);
            
    $norus=0;
        }
        else
            
    $norus=1;    
    }
    fclose($in);
    fclose($out);

    $in=fopen("out_tmp.txt","r");
    $out=fopen("out.txt","w");
    while (!
    feof($in))
    {
        
    $str=fgets($in,1024);
        if (
    strlen($str)>2)
            
    fwrite($out,tolow($str));
    }
    fclose($in);
    fclose($out);

    unlink("out_tmp.txt");
    ?>
    Или, что быстрее порядка на два, на СИ (Microsoft Visual Studio 6.0)

    Code:
    #include "stdafx.h"
    #include "stdio.h"
    #include "string.h"
    
    FILE *in,*out;
    
    void tolow(char str[1024])
    {
    	char ret[1024];
    	int i;
    
    	strcpy(ret,str);
    
    	for (i=0;i<strlen(str);i++)
    		switch (str[i])
    		{
    			case 'Ё': ret[i]='ё'; break;
    			case 'Й': ret[i]='й'; break;
    			case 'Ц': ret[i]='ц'; break;
    			case 'У': ret[i]='у'; break;
    			case 'К': ret[i]='к'; break;
    			case 'Е': ret[i]='е'; break;
    			case 'Н': ret[i]='н'; break;
    			case 'Г': ret[i]='г'; break;
    			case 'Ш': ret[i]='ш'; break;
    			case 'Щ': ret[i]='щ'; break;
    			case 'З': ret[i]='з'; break;
    			case 'Х': ret[i]='х'; break;
    			case 'Ъ': ret[i]='ъ'; break;
    			case 'Ф': ret[i]='ф'; break;
    			case 'Ы': ret[i]='ы'; break;
    			case 'В': ret[i]='в'; break;
    			case 'А': ret[i]='а'; break;
    			case 'П': ret[i]='п'; break;
    			case 'Р': ret[i]='р'; break;
    			case 'О': ret[i]='о'; break;
    			case 'Л': ret[i]='л'; break;
    			case 'Д': ret[i]='д'; break;
    			case 'Ж': ret[i]='ж'; break;
    			case 'Э': ret[i]='э'; break;
    			case 'Я': ret[i]='я'; break;
    			case 'Ч': ret[i]='ч'; break;
    			case 'С': ret[i]='с'; break;
    			case 'М': ret[i]='м'; break;
    			case 'И': ret[i]='и'; break;
    			case 'Т': ret[i]='т'; break;
    			case 'Ь': ret[i]='ь'; break;
    			case 'Б': ret[i]='б'; break;
    			case 'Ю': ret[i]='ю'; break;		
    			default: ret[i]=str[i];
    		}
    	
    	fputs(ret,out);
    }
    
    void main()
    {
    	int norus,n;
    	char str[1024];
    	char c;
    
    	in=fopen("in.txt","r");
    	out=fopen("out_tmp.txt","w");
    	norus=0;
    	n=0;
    	while (!feof(in))
    	{
    		n++;
    		c=fgetc(in);
    		if (((c>='а')&&(c<='я'))||((c>='А')&&(c<='Я')))
    		{
    			if ((norus==1)&&(n!=1))
    				fputc('\n',out);
    			fputc(c,out);
    			norus=0;
    		}
    		else
    			norus=1;	
    	}
    	fclose(in);
    	fclose(out);
    
    	in=fopen("out_tmp.txt","r");
    	out=fopen("out.txt","w");
    	while (!feof(in))
    	{		
    		if (!fgets(str,1024,in))
    			break;
    		if (strlen(str)>2)
    			tolow(str);
    	}
    	fclose(in);
    	fclose(out);
    
    	unlink("out_tmp.txt");
    	
    }
    
     
    #1 AdvLamer, 16 Apr 2007
    Last edited: 16 Apr 2007
    8 people like this.
  2. DDA

    DDA Elder - Старейшина

    Joined:
    2 Jan 2007
    Messages:
    428
    Likes Received:
    375
    Reputations:
    13
    соеденить файлы можно тоже в тотал командере(хотя там стоит ограничение на 999 файлов :( )

    "разбить - собрать файл "

    для этого в групповом переименовании файлов надо их переименовать с расширением .001 .002 - .009 - .099 - .999
    а потом функцией собрать файл указать первый файл .001
     
    #2 DDA, 16 Apr 2007
    Last edited: 16 Apr 2007
  3. genom--

    genom-- Elder - Старейшина

    Joined:
    9 Jul 2006
    Messages:
    668
    Likes Received:
    416
    Reputations:
    288
    и накой замарачиваться на создание словаря со своего ввеника -- нежели вы думаете кто-то ставит паролем какуюнить чушь из фалов винды???

    в нете полно готовых словарей опробованных словарей - качайте и не парьтесь-- да и вообще не проще генератором паролей воспользоваться или какуюнить большую книгу на английском разбить на словарь по пробелам ??

    имхо бред
     
  4. Hawkins

    Hawkins Elder - Старейшина

    Joined:
    24 Jan 2007
    Messages:
    60
    Likes Received:
    31
    Reputations:
    5
    Вообще тема называется "Парсер текстовых файлов"
    Парсинг имеющихся текстовиков это частный случай, приведённый в качестве примера.
    Если нехватает фантазии на скачивание пары гектаров книг и последующем парсинге оных, только потому, что об этом не упомянуто дословно, то это не вина тс.

    зыж словари от AdvLamer'a одни из лучших, которые доступны. Пробив отличный.
    Ну и за парсер однозначный плюс =)
     
    1 person likes this.
  5. AdvLamer

    AdvLamer Elder - Старейшина

    Joined:
    1 Jan 2006
    Messages:
    228
    Likes Received:
    205
    Reputations:
    112
    2DDA
    Да я потом тоже нашел
    Как то своей прогой приятнее :)

    genom--
    Я посмотрю где ты найдешь в нете словарей русских слов на 30 Мб
    Все что я кучу времени собирал летом, что было в предыдущем русском словаре, весило 3.5 Мб!!!

    Большую книгу на английском? А парсер для чего тогда, извини меня? Ты не догадываешься, что чтобы как раз твою большую книгу и разбить на слова, он как раз и нужен?
    И смею тебя заверить, с одной книги ты даже метр не наберешь, нужна куча контента, который как раз и собирался в соседней теме

    Генератором паролей????? И че тебе будет толку от слова пёнпаоафрв

    Про веник: метр словаря как раз с него и собран (йопт, там не только winnt, а ВЕСЬ винт, где было мегов 100 статей Computer Press и еще кучу всего)

    ИМХО бред то, что написал ты, полный

    2Hawkins
    Спасибо за солидарность
     
    1 person likes this.
  6. DDA

    DDA Elder - Старейшина

    Joined:
    2 Jan 2007
    Messages:
    428
    Likes Received:
    375
    Reputations:
    13
    то AdvLamer

    ну никак не хочет соеденять файлы пронумерованные 1.txt .. 25978.txt :)
    http://advlamer.narod.ru/dprogs/glue_files.rar

    при запуске спрашивает прога скоко файлов ? ставлю любое число хоть 1 хоть 100 хоть все

    или дальше первого не уходит или вообще ничего не записывает в исходный файл

    первый файл бывший html
     
  7. Talisman

    Talisman Elder - Старейшина

    Joined:
    22 Apr 2006
    Messages:
    400
    Likes Received:
    151
    Reputations:
    80
    !!! нах таблицу перевода? загляни в таблицу аски символов, и заметь, то что заглавные и стрчоные буквы сдвинуты на константу!
     
  8. AdvLamer

    AdvLamer Elder - Старейшина

    Joined:
    1 Jan 2006
    Messages:
    228
    Likes Received:
    205
    Reputations:
    112
    торопилсо
    так было быстрее
    а в принципе не суть важно

    Разобрались в асе, приду домой перекомпилю


    ***************************************************

    Залил откомпилированный
    http://advlamer.narod.ru/mprogs/text_parser.rar

    Исправил эту http://advlamer.narod.ru/dprogs/glue_files.rar

    2Talisman
    А хрень какая то получается между буквами 'п' и 'р'
    'ё' и 'Ё' тоже не на месте

    Code:
    65 - A
    66 - B
    67 - C
    68 - D
    69 - E
    70 - F
    71 - G
    72 - H
    73 - I
    74 - J
    75 - K
    76 - L
    77 - M
    78 - N
    79 - O
    80 - P
    81 - Q
    82 - R
    83 - S
    84 - T
    85 - U
    86 - V
    87 - W
    88 - X
    89 - Y
    90 - Z
    
    97 - a
    98 - b
    99 - c
    100 - d
    101 - e
    102 - f
    103 - g
    104 - h
    105 - i
    106 - j
    107 - k
    108 - l
    109 - m
    110 - n
    111 - o
    112 - p
    113 - q
    114 - r
    115 - s
    116 - t
    117 - u
    118 - v
    119 - w
    120 - x
    121 - y
    122 - z
    
    128 - А
    129 - Б
    130 - В
    131 - Г
    132 - Д
    133 - Е
    134 - Ж
    135 - З
    136 - И
    137 - Й
    138 - К
    139 - Л
    140 - М
    141 - Н
    142 - О
    143 - П
    144 - Р
    145 - С
    146 - Т
    147 - У
    148 - Ф
    149 - Х
    150 - Ц
    151 - Ч
    152 - Ш
    153 - Щ
    154 - Ъ
    155 - Ы
    156 - Ь
    157 - Э
    158 - Ю
    159 - Я
    
    160 - а
    161 - б
    162 - в
    163 - г
    164 - д
    165 - е
    166 - ж
    167 - з
    168 - и
    169 - й
    170 - к
    171 - л
    172 - м
    173 - н
    174 - о
    [color=red]175 - п
    224 - р[/color]
    225 - с
    226 - т
    227 - у
    228 - ф
    229 - х
    230 - ц
    231 - ч
    232 - ш
    233 - щ
    234 - ъ
    235 - ы
    236 - ь
    237 - э
    238 - ю
    239 - я
    240 - Ё
    241 - ё
    
     
    #8 AdvLamer, 16 Apr 2007
    Last edited: 16 Apr 2007