6

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

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

aardvark
apple
azolio

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

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

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

13 ответов13

10

Чтобы добавить текст 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 или более" и опции "не соответствовать".)

6

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

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

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

4

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

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

3

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

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

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

2

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

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

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

  ^[[:alpha:]]{7,}\n

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

2

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

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

1

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

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

.{6,}

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

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

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

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

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

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

Find what:      .{8,}\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
1

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

^. {0,6} $

0

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

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

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

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

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

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

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

0

Это можно сделать с помощью однострочного Perl (избавляясь от каждого слова длиннее 7 символов):

perl -nle "print if length($_) <= 7" "D:\temp2\input.txt" > ShortWords.txt

Поместите это в BAT-файл или выполните непосредственно из окна командной строки (Run/cmd).

Perl требуется для установки. Я использую ActivePerl - его очень легко установить, так как у него есть обычный установщик Windows. URL для прямой загрузки.

Для второй части вашего вопроса (генерация команд SQL): это всего лишь расширение первого однострочного Perl:

perl -nle "print 'INSERT INTO Words (word) VALUES (\'' . $_ . '\');' if length($_) <= 7" "D:\temp2\input.txt" > SQLcommands.txt

Если это становится более сложным, то, вероятно, лучше с обычным сценарием Perl, как предложил Джон Т.

0

Вы можете решить это без какого-либо дополнительного инструмента для загрузки, используя небольшой макрос vbScript или Excel VBA. Это действительно больше вопрос для stackoverflow.com. Код для этого скрипта также будет работать в Excel VBA практически без изменений.

Образец VBA (не тестировался) может быть:

Sub filterRows()  
     Dim InputData  
     Open "c:\test.txt" For Input As #1    ' Open file for input.  
     Open "c:\out.txt" For Output As #2  
     Do While Not EOF(1)             ' Check for end of file.  
        Line Input #1, InputData    ' Read line of data.  
        If Len(InputData) <= 7 Then  
            Print #2, InputData  
        End If  
     Loop  
     Close #1    ' Close file.  
     Close #2  

End Sub 
0

Хотите верьте, хотите нет, но Microsoft Word фактически имеет регулярные выражения. CTR+H> Подробнее> Подстановочный знак. Выражение поиска, вероятно, будет чем-то вроде [.]{8+} - нажмите F1, пока отображается диалоговое окно «Поиск / замена», чтобы увидеть описание регулярных выражений Word.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .