LinuxForum.Fans
Тема

Как удалить мусор из файла

Автор: valet 18 сообщений 5576 просмотров
#262813

Имеется файл с запросами типа:


...
300 разных обоин iPad [PNG/iPad]
300 рецептов. Блюда из духовки
300 рецептов. Сырая пища и ее приготовление
300 лучших песен для детей
300 самых важных английских слов в картинках для начинающих
300 самых клёвых рингтонов
300 самых распространенных английских слов
300 §С§в§Ъ§Ы§и§Ц§У §Я§С §Ф§а§Т§Э§Ъ§Я§г§Ь§а§Ю
300 семей которые правят миром
300 советов и 200 рецептов рыболову
...

Нужно удалить из него мусор. В данном случае это запросы:

300 лучших песен для детей
300 §С§в§Ъ§Ы§и§Ц§У §Я§С §Ф§а§Т§Э§Ъ§Я§г§Ь§а§Ю

То есть после обработки такого файла должно остаться:


...
300 разных обоин iPad [PNG/iPad]
300 рецептов. Блюда из духовки
300 рецептов. Сырая пища и ее приготовление
300 самых важных английских слов в картинках для начинающих
300 самых клёвых рингтонов
300 самых распространенных английских слов
300 семей которые правят миром
300 советов и 200 рецептов рыболову
...

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

Думаю что можно как-то sed'ом отбирать нужной регуляркой, которая будет отбирать нормальные запросы - а это все латинские и кириллические символы.
Но остановился на уровне идей, как написать регулярку пока не знаю. Может кто-то на любимом по линуксу форуме поможет :)

П.С. А я пока думаю сам параллельно :). Если найду решение - обязательно тут запощу.

#262815

Вот так пойдёт?

text
cat data_file | egrep -v "§|ѓ"
#262819

Врядли, нет гарантии что там кроме этих 2х не может быть других левых символов. Может лучше описать регулярку нужных символов.

"Vascom" написал:
§|ѓ
#262820

Конечно, добавь туда ещё несколько нужных символов, которые точно не встретятся в хороших строках. Ну и прогони - посмотри.
Ты же не привёл весь файл. А тот отрывок, что приведён отлично фильтруется и этой регуляркой. Телепатия уже на пределе :)

#262824
"Vascom" написал:
Ты же не привёл весь файл.

Там около 3 млн. строк :)
Задача - написать регулярку для взятия правильных вариантов - как мне кажется будет корректнее. Я точно знаю, что мне нужны все латинские и кириллические символы, знаки препинания и т.д. А мусора там всякого много, ну например типа такого:

text
������� �13

и я же не могу предвидеть все варианты.

#262826

Если ты не можешь предвидеть все варианты, то ты не сможешь создать регулярное выражение!

#262828

можно на костылях iconv'а как-то так сработать:

text
cat file | while read STR; do
  echo "$STR" | inconv -t KOI-8 && >/dev/null && 
    echo "$STR" | inconv -t cp1251 >/dev/null && 
    echo "$STR" | inconv -t ISO-8859-5 >/dev/null && 
      echo "$STR">>out_file
done

если текст в три кирилические кодировки конвертируется, то он скорей всего хороший...

#262833

"Vascom" написал:
Если ты не можешь предвидеть все варианты, то ты не сможешь создать регулярное выражение!
Вот именно - поэтому не возможно создать регулярку для плохих вариантов, но я четко знаю что мне нужны варианты с нашими буквами, английскими и всякие там скобки, запятые, точки т.д. - поэтому для хороших вариантов как раз и надо строить регулярку и с этого надо выходить как мне кажется.
#262834

"Fat-Zer" написал:
если текст в три кирилические кодировки конвертируется, то он скорей всего хороший...
скорее всего, спасибо, сейчас попробую.
#262835

valet написал:
[quote="Vascom"]Если ты не можешь предвидеть все варианты, то ты не сможешь создать регулярное выражение!
Вот именно - поэтому не возможно создать регулярку для плохих вариантов, но я четко знаю что мне нужны варианты с нашими буквами, английскими и всякие там скобки, запятые, точки т.д. - поэтому для хороших вариантов как раз и надо строить регулярку и с этого надо выходить как мне кажется.[/quote]
Ну а если наша буква или точка входит в плохую стоку, тогда как ты поступишь?
#262840

"Vascom" написал:
Ну а если наша буква или точка входит в плохую стоку, тогда как ты поступишь?
Да, точка действительно может входить, но не наша буква. В регулярку для хороших вариантов значит не надо включать всякие там скобки, запятые, точки т.д. -да и зачем, тут принцип должен быть - если в строке есть хотя бы одна нужная буква.
#262841

Ну гляди, у тебя в строке

text
300 §С§в§Ъ§Ы§и§Ц§У §Я§С §Ф§а§Т§Э§Ъ§Я§г§Ь§а§Ю

куча наших букв.

#262843
"Vascom" написал:
куча наших букв.
да, дайствительно, даже не обратил внимания.

"Fat-Zer" написал:
cat file | while read STR; do echo "$STR" | iconv -t KOI-8 && >/dev/null && echo "$STR" | iconv -t cp1251 >/dev/null && echo "$STR" | iconv -t ISO-8859-5 >/dev/null && echo "$STR">>out_file done

Это способ действительно отлично работает. Из плохих остаются только запросы типа:

text
????????? (2012) (76,77 ?????)
?????????? (2012) (77,78 ?????)
??? ??????? ????? (2012) (7,8 ?????)
?????? (2012) (7,8 ?????)
?????????? ????? (2012) (7,8 ?????)
???????????? ??? ???? (2012) (7,8 ?????)
?????? ?? ?????? (2012) (7,8,9 ?????)
????????? (2012) (8 ?????)
?????????? (2012) (82,83 ?????)

Вот убрать бы еще и их. Тут принцип - если в строке более одного "?" - убираем.

#262844

Ну теперь-то можно? :)

text
 | egrep -v "\?\?"
#262845
Vascom написал:
Ну теперь-то можно? :)
text
 | egrep -v "\?\?"

Спасибо, отлично :)

Еще раз (может кому-то пригодится), полное решение вопроса:

cat file | while read STR; do
echo "$STR" | iconv -t KOI-8 && >/dev/null &&
echo "$STR" | iconv -t cp1251 >/dev/null &&
echo "$STR" | iconv -t ISO-8859-5 >/dev/null &&
echo "$STR">>out_file
done
cat out_file | egrep -v "\?\?" > result.txt

Всем спасибо за помощь, файл еще обрабатывается, потому что повторюсь - там 3 млн строк :), но уже вижу, что вопрос решен.

#262921

пора уже отдельную ветку создавать для тем про обработку текста :)

#262924
moshell написал:
пора уже отдельную ветку создавать для тем про обработку текста :)

Да их тысячи в разделе Программирование.

#262926

дык тем более

Войдите или зарегистрируйтесь, чтобы ответить.