Разбор текстовых файлов

6791
Joe Phillips

Сегодня вечером я столкнулся с ситуацией, когда хотел проанализировать текстовый файл. У меня был очень, очень длинный список слов, который содержал английские слова, разделенные линиями. Я хотел избавиться от каждого слова (или строки) длиной более 7 символов. Это было бы просто в Linux, но я не могу найти простое решение в Windows XP. Я пытался использовать поиск по регулярным выражениям в Notepad ++, но это был огромный провал. Я попытался использовать выражение, .не найдя совпадений. Я действительно в растерянности, потому что я думал, что такого рода вещи будут чрезвычайно просты, и для выполнения такой задачи потребуются тонны инструментов. Кажется, что Notepad ++ поддерживает все остальные функции в мире, кроме самых простых, которые кажутся наиболее очевидными.

Еще одна из моих целей заключалась в том, чтобы поместить код перед и после слова в каждой строке.

aardvark apple azolio 

превратится в

INSERT INTO Words (word) VALUES ('aardvark'); INSERT INTO Words (word) VALUES ('apple'); INSERT INTO Words (word) VALUES ('azolio'); 

Какие предложения / инструменты / советы у вас есть для выполнения задач, аналогичных этим в Windows XP?

6

13 ответов на вопрос

9
bobbymcr

Чтобы добавить текст SQL, вы можете попробовать эту командную строку одним вкладышем:

(for /f %i in (words.txt) do @echo INSERT INTO Words ^(word^) VALUES ^('%i'^)) > words.sql

Чтобы отфильтровать строки в текстовом файле длиной более 7 символов, вы можете использовать другой инструмент командной строки findstr:

findstr /v /r ^.........*$ words.txt > shorter-words.txt

Параметр / r указывает, что вы хотите использовать сопоставление регулярному выражению, а параметр / v заставляет его печатать строки, которые не совпадают. (Поскольку оказывается, что findstr не позволяет вам указывать диапазон подсчета символов, я подделал его с помощью шаблона «8 или более» и опции «не соответствовать».)

Это на самом деле довольно быстро и удивительно. Я никогда не знал, что вы можете сделать это с помощью командной строки Windows! Joe Phillips 14 лет назад 0
Ему удалось выполнить команду findstr на 1,66 МБ всего за несколько секунд. Затем он выполнил часть SQL за 1 минуту. Очень впечатляюще. Joe Phillips 14 лет назад 0
6
John T

Perl точно, просто вставьте этот скрипт и запустите его в том же каталоге, что и список слов. Измените имя вашего словаря на words.txt или измените имя в скрипте. Вы можете перенаправить вывод в новый файл следующим образом:

words.pl > list.txt 

без дополнительной пользы (быстро взбиваем, можно немного срубить):

open FILE, "words.txt" or die $!;  my @words = <FILE>;  foreach $word(@words) { print $word if(length($word) <= 8); } 
4
nik

Вы можете получить GNUWin32 sedдля Windows XP.
Точно так же AWKи Perlтоже.
Это если вы привыкли к написанию сценариев Unix (если это так, рассмотрите Cygwin).

В противном случае есть также PowerShell.

4
Rolnik

gVim - достойный инструмент для редактирования, который берет свое начало в почтенном vi, используемом в системах Unix. Вы захотите использовать команду замещения, чтобы выполнить глобальный поиск / замену для каждого слова.

AWK и Perl - очень мощные инструменты, но они излишни в том, что вам нужно. Вам понравится gVim, так как он в первую очередь редактор. С gVim очень приятно то, что вы только в одном нажатии от него, чтобы дать ему команду поиска / замены / замены, которая может быть указана в надежном формате регулярных выражений.
Удачи.

3
Dan Rosenstark

Массово недооценивается как инструмент разработки Microsoft Excel (или OpenOffice Spreadsheets). Максимальное количество строк, но вы можете воспользоваться одним из этих инструментов.

Затем вы можете просто использовать функции left, mid, if и т. Д. В электронной таблице в формулах, которые идут справа от ваших строк. Они будут автоматически скопированы с относительными ссылками.

Во многих случаях это намного проще, чем кодирование, если вы не программист :) Оттуда вы можете импортировать, экспортировать и делать много интересных вещей, даже с текстом.

Да, главная проблема в том, что он может содержать только ~ 65500 строк :( Joe Phillips 14 лет назад 1
был там, это облом. ты пробовал одеску? :) Dan Rosenstark 14 лет назад 0
2
Eli Bendersky

Может быть, это лучше подходит для StackOverflow, потому что лучший совет, который я могу вам дать, - это изучить один из языков сценариев, чтобы облегчить такие задачи. ИМХО, гораздо лучше знать один мощный инструмент, чем десятки маленьких, и это окупаемость инвестиций.

Загрузка Python и прохождение учебника займет несколько часов, но впоследствии такие задачи покажутся вам очень простыми. А еще лучше, вы научитесь распознавать задачи, «ищущие программирование» и в других областях, и это увеличит вашу производительность в десять раз.

Я знаю много сценариев / программирования, но я не думаю, что это необходимо. Это один из тех случаев, когда я пытаюсь привыкнуть к чему-то, что не является программным решением. Joe Phillips 14 лет назад 2
Зачем? не проще ли его запрограммировать? Вы также можете сохранить скрипт, который можно будет использовать позже Eli Bendersky 14 лет назад 0
Это несколько теоретический вопрос для дальнейшего использования. Я бы предпочел иметь возможность программирования ИЛИ с помощью инструмента Joe Phillips 14 лет назад 1
2
Umber Ferrule

Я бы использовал TextPad для этого.

Я широко использовал его для регулярных выражений в прошлом.

Я бы попробовал найти что-то вроде:

 ^[[:alpha:]]\n 

И заменить ничем.

1
Joel Coehoorn

Ваше выражение не верно. Вы хотите это:

^. $

1
Joshua Cole

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

Вы сказали, что используете следующее регулярное выражение, но оно не работает:

. 

Это выражение выглядит хорошо и должно соответствовать всем строкам, которые содержат 6 или более символов.

Насколько большой текстовый файл? Notepad ++ может занять некоторое время для выполнения регулярных выражений для очень больших файлов, поэтому возможно, что он не был закончен.

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

Если вы уверены, что это выражение не сработало, вы уверены, что режим поиска был установлен на Регулярное выражение, а ". Соответствия новой строки" не был установлен?

Чтобы решить вашу проблему, я бы выполнил следующие шаги в notepad ++:

Удалить все строки длиннее 7 символов. Выполните поиск и замену в Notepad ++ следующим выражением:

Find what: .\r?\n? Replace with: 

Это удалит любую строку длиной более 7 символов, а также удалит символы новой строки и возврата каретки, если они есть.

Заменить слова кодом

Предполагая, что в каждой строке просто есть слово (без начальных / конечных пробелов, нежелательных символов и т. Д.), Это также можно сделать с помощью простого поиска и замены:

Find What: (.*) //Match the whole line, store in capture group Replace with: INSERT INTO Words (word) VALUES ('\1'); //reference value of capure group with \1 
0

Я второй использую Excel для этого.

Поместите все свои слова в колонку А.

Поместите эту формулу в столбец B:

= ЕСЛИ (LEN (A1)> 7, "", CONCATENATE ("ВСТАВИТЬ В ЗНАКИ (word) ЗНАЧЕНИЙ ('", A1, "')"))

Скопируйте формулу для всех строк.

Каждая строка в столбце B будет содержать команду sql insert, если длина слова меньше 7. В противном случае она будет пустой.

Если вы хотите удалить пустые строки, скопируйте и вставьте в качестве значения столбец B в другой столбец, а затем просто отсортируйте столбец. Пустые строки будут сдвинуты вниз.

Этот файл имеет + 150 тыс. Слов. Я не думаю, что Excel даже откроет его. Joe Phillips 14 лет назад 0
Да, вы правы, Excel будет делать только 65536 строк. 14 лет назад 0
Excel 2003 и более ранние версии имеют эти ограничения, но если они у вас есть, Excel 2007 значительно увеличил эти ограничения. См. Http://office.microsoft.com/en-us/excel/HP100738491033.aspx. bobbymcr 14 лет назад 0