AdvLamer
16.04.2007, 00:36
Парсер текстовых файлов
В помошь тем, кто хочет пропарсить свой винт и/или создать небольшой словарь :)
(при создании нового словаря около метра из него было собрано из несколько десятков кило "текстовых" файлов из папки 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
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)
#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");
}
В помошь тем, кто хочет пропарсить свой винт и/или создать небольшой словарь :)
(при создании нового словаря около метра из него было собрано из несколько десятков кило "текстовых" файлов из папки 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
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)
#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");
}